Open
Description
Bug description
I injected Neo4jChatMemoryRepository
, When call chatMemory.get() function, it throws exception:
[Request processing failed: org.neo4j.driver.exceptions.ClientException: Invalid input '$': expected "%", "(" or an identifier (line 1, column 10 (offset: 9))
"MATCH (s:$($sessionLabel) {id:$conversationId})-[r:HAS_MESSAGE]->(m:$($messageLabel))"
^] with root cause
org.neo4j.driver.exceptions.ClientException: Invalid input '$': expected "%", "(" or an identifier (line 1, column 10 (offset: 9))
"MATCH (s:$($sessionLabel) {id:$conversationId})-[r:HAS_MESSAGE]->(m:$($messageLabel))"
^
at org.neo4j.driver.internal.util.Futures.blockingGet(Futures.java:64) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.InternalTransaction.run(InternalTransaction.java:55) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.DelegatingTransactionContext.run(DelegatingTransactionContext.java:56) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.InternalExecutableQuery.lambda$execute$0(InternalExecutableQuery.java:82) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.InternalSession.lambda$execute$4(InternalSession.java:161) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.InternalSession.lambda$transaction$5(InternalSession.java:178) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.retry.ExponentialBackoffRetryLogic.retry(ExponentialBackoffRetryLogic.java:112) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.InternalSession.transaction(InternalSession.java:175) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.InternalSession.execute(InternalSession.java:160) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.InternalExecutableQuery.execute(InternalExecutableQuery.java:95) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.ExecutableQuery.execute(ExecutableQuery.java:150) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.springframework.ai.chat.memory.repository.neo4j.Neo4jChatMemoryRepository.findByConversationId(Neo4jChatMemoryRepository.java:87) ~[spring-ai-model-chat-memory-repository-neo4j-1.0.0.jar:1.0.0]
at org.springframework.ai.chat.memory.MessageWindowChatMemory.add(MessageWindowChatMemory.java:63) ~[spring-ai-model-1.0.0.jar:1.0.0]
at org.springframework.ai.chat.memory.ChatMemory.add(ChatMemory.java:46) ~[spring-ai-model-1.0.0.jar:1.0.0]
at cn.cisdigital.datakits.ai.demo.memory.neo4j.controller.StreamingChatNeo4jController.multipleChat(StreamingChatNeo4jController.java:39) ~[classes/:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258) ~[spring-web-6.2.8.jar:6.2.8]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191) ~[spring-web-6.2.8.jar:6.2.8]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.8.jar:6.2.8]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986) ~[spring-webmvc-6.2.8.jar:6.2.8]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891) ~[spring-webmvc-6.2.8.jar:6.2.8]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.8.jar:6.2.8]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.2.8.jar:6.2.8]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.2.8.jar:6.2.8]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.8.jar:6.2.8]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.2.8.jar:6.2.8]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.42.jar:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.2.8.jar:6.2.8]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.42.jar:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.42.jar:10.1.42]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.2.8.jar:6.2.8]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.8.jar:6.2.8]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.2.8.jar:6.2.8]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.8.jar:6.2.8]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.2.8.jar:6.2.8]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.8.jar:6.2.8]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Suppressed: org.neo4j.driver.internal.util.ErrorUtil$InternalExceptionCause: null
at org.neo4j.driver.internal.adaptedbolt.ErrorMapper.mapToNeo4jException(ErrorMapper.java:222) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.adaptedbolt.ErrorMapper.mapBoltFailureException(ErrorMapper.java:139) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.adaptedbolt.RoutedErrorMapper.mapBoltFailureException(RoutedErrorMapper.java:61) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.adaptedbolt.ErrorMapper.map(ErrorMapper.java:79) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.driver.internal.adaptedbolt.AdaptingDriverResponseHandler.onError(AdaptingDriverResponseHandler.java:52) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
at org.neo4j.bolt.connection.routed.impl.RoutedBoltConnection$1.onError(RoutedBoltConnection.java:191) ~[neo4j-bolt-connection-routed-2.0.0.jar:na]
at org.neo4j.bolt.connection.pooled.impl.PooledBoltConnection$1.onError(PooledBoltConnection.java:193) ~[neo4j-bolt-connection-pooled-2.0.0.jar:na]
at org.neo4j.bolt.connection.netty.impl.BoltConnectionImpl$ResponseHandleImpl.lambda$onError$1(BoltConnectionImpl.java:611) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at org.neo4j.bolt.connection.netty.impl.BoltConnectionImpl$ResponseHandleImpl.runIgnoringError(BoltConnectionImpl.java:742) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at org.neo4j.bolt.connection.netty.impl.BoltConnectionImpl$ResponseHandleImpl.onError(BoltConnectionImpl.java:611) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at org.neo4j.bolt.connection.netty.impl.BoltConnectionImpl$4.onError(BoltConnectionImpl.java:239) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at org.neo4j.bolt.connection.netty.impl.messaging.v3.BoltProtocolV3.lambda$run$10(BoltProtocolV3.java:389) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2194) ~[na:na]
at org.neo4j.bolt.connection.netty.impl.handlers.RunResponseHandler.onFailure(RunResponseHandler.java:50) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at org.neo4j.bolt.connection.netty.impl.async.inbound.InboundMessageDispatcher.handleFailureMessage(InboundMessageDispatcher.java:109) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at org.neo4j.bolt.connection.netty.impl.messaging.common.CommonMessageReader.unpackFailureMessage(CommonMessageReader.java:80) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at org.neo4j.bolt.connection.netty.impl.messaging.common.CommonMessageReader.read(CommonMessageReader.java:53) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at org.neo4j.bolt.connection.netty.impl.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:81) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at org.neo4j.bolt.connection.netty.impl.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:34) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
at org.neo4j.bolt.connection.netty.impl.async.inbound.MessageDecoder.channelRead(MessageDecoder.java:40) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:333) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:455) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:289) ~[netty-handler-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1357) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:868) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:796) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:732) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:658) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998) ~[netty-common-4.1.122.Final.jar:4.1.122.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.122.Final.jar:4.1.122.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.122.Final.jar:4.1.122.Final]
... 1 common frames omitted

Environment
Java: 21
spring-ai version: 1.0.0
Neo4j Server version: 5.16.0 (community)
Minimal Complete Reproducible example
code:
@RestController
@RequestMapping("/v1/chat")
public class StreamingChatNeo4jController {
private final ChatClient chatClient;
private final ChatMemory chatMemory;
public StreamingChatNeo4jController(ChatClient.Builder chatClientBuilder, Neo4jChatMemoryRepository chatMemoryRepository) {
this.chatClient = chatClientBuilder.defaultSystem("Brief answer").build();
chatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(chatMemoryRepository)
.maxMessages(500)
.build();
}
@GetMapping(value = "/completions", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> multipleChat(
@RequestParam(value = "modelName") String modelName,
@RequestParam("userInput") String userInput,
@RequestParam(value = "sessionId") String sessionId) {
var chatOptions = OpenAiChatOptions.builder().model(modelName).build();
chatMemory.add(sessionId, new UserMessage(userInput));
var responseContent = new StringBuilder();
return this.chatClient
.prompt()
.messages(chatMemory.get(sessionId))
.options(chatOptions)
.stream()
.content()
.doOnNext(responseContent::append)
.doOnComplete(() -> chatMemory.add(sessionId, new AssistantMessage(responseContent.toString())));
}
}
yaml:
server:
port: 8080
servlet:
context-path: /ai
spring:
application:
name: app-datakits-ai
ai:
openai:
base-url: xxx
api-key: sk-xxx
chat:
memory:
repository:
neo4j:
session-label: Session
message-label: Message
tool-call-label: ToolCall
tool-response-label: ToolResponse
metadata-label: Metadata
media-label: Media
neo4j:
uri: 'neo4j://xxx'
authentication:
username: neo4j
password: xxx
pom dependencies:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-chat-memory-repository-neo4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>