Skip to content

Commit e796d01

Browse files
committed
various additions
1 parent 7fe5b4f commit e796d01

File tree

1 file changed

+88
-11
lines changed

1 file changed

+88
-11
lines changed

modules/genai-ecosystem/pages/langchain4j.adoc

Lines changed: 88 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,80 @@ An example is avalable at: https://github.com/langchain4j/langchain4j-examples/t
4040
include::https://github.com/langchain4j/langchain4j-examples/raw/main/neo4j-example/src/main/java/Neo4jEmbeddingStoreExample.java[]
4141
----
4242

43-
=== Usage Examples
44-
4543
To create a Neo4jEmbeddingStore, we can write:
4644
[source,java]
4745
----
4846
Neo4jEmbeddingStore embeddingStore = Neo4jEmbeddingStore.builder().<builderParameters>.build();
4947
50-
// where <builderParameters> can be the following:
51-
.dimension(384)
52-
.label(LABEL_TO_SANITIZE)
53-
.build();
48+
5449
5550
// we can use with `withBasicAuth`
5651
.withBasicAuth(neo4jContainer.getBoltUrl(), USERNAME, ADMIN_PASSWORD)
5752
// as alternative to driver:
5853
Driver driver = GraphDatabase.driver(neo4jContainer.getBoltUrl(), AuthTokens.basic(USERNAME, ADMIN_PASSWORD));
5954
----
6055

56+
Where `<builderParameters>` must have `dimension` and either `driver` or `withBasicAuth` parameters,
57+
besides other optional ones.
58+
59+
Here is the complete builder list:
60+
61+
[options="header",cols="m,m,a"]
62+
|===
63+
| Key | Default Value | Description
64+
| driver | <required if withBasicAuth is not set> | the https://neo4j.com/docs/api/java-driver/current/org.neo4j.driver/org/neo4j/driver/Driver.html[Java Driver instance]
65+
| withBasicAuth | <required if withBasicAuth is not set> | Creates an instance of Neo4jEmbeddingStore defining a https://neo4j.com/docs/api/java-driver/current/org.neo4j.driver/org/neo4j/driver/Driver.html[Java Driver instance], starting from `uri`, `user` and `password`
66+
| dimension | <required> | the vector's dimension
67+
| config | org.neo4j.driver.SessionConfig.forDatabase(`<databaseName>`) | the https://neo4j.com/docs/api/java-driver/current/org.neo4j.driver/org/neo4j/driver/SessionConfig.html[SessionConfig instance]
68+
| label | "Document" | the label name
69+
| embeddingProperty | "embedding" | the embedding property name
70+
| idProperty | "id" | the id property name
71+
| metadataPrefix | "" | the metadata prefix
72+
| textProperty | "text" | the text property name
73+
| indexName | "vector" | the vector index name
74+
| databaseName | "neo4j" | the database name
75+
| retrievalQuery | "RETURN properties(node) AS metadata, node.`idProperty` AS `idProperty`, node.`textProperty` AS `textProperty`, node.`embeddingProperty` AS `embeddingProperty`, score" | the retrieval query
76+
|===
77+
78+
=== Usage Examples
79+
80+
LangChain4j provides the following classes for Neo4j integration:
81+
- `Neo4jEmbeddingStore`: Implements the EmbeddingStore interface, enabling storing and querying vector embeddings in a Neo4j database.
82+
- `Neo4jText2CypherRetriever`: Supports retrieving original content associated with stored embeddings.
83+
84+
==== Neo4jEmbeddingStore
85+
86+
We can define an `Neo4jEmbeddingStore` with the required Java Driver instance and dimension and an optional label name in this way:
87+
88+
[source,java]
89+
----
90+
Driver driver = GraphDatabase.driver('<boltURL>', AuthTokens.basic('<username>', '<password>'));
91+
92+
Neo4jEmbeddingStore embeddingStore = Neo4jEmbeddingStore.builder()
93+
.withDriver(driver)
94+
.dimension(384)
95+
.label("CustomLabel")
96+
.build();
97+
----
98+
99+
We can use `withBasicAuth` as an alternative to `driver` creation:
100+
[source,java]
101+
----
102+
Neo4jEmbeddingStore embeddingStore = Neo4jEmbeddingStore.builder()
103+
.withBasicAuth('<boltURL>', '<username>', '<password>')
104+
.<otherBuilderParameters>
105+
.build();
106+
107+
/* instead of
108+
Driver driver = GraphDatabase.driver('<boltURL>', AuthTokens.basic('<username>', '<password>'));
109+
Neo4jEmbeddingStore embeddingStore = Neo4jEmbeddingStore.builder()
110+
.withDriver(driver)
111+
.<otherBuilderParameters>
112+
.build()
113+
*/
114+
115+
----
116+
61117
To add embeddings, execute:
62118
[source,java]
63119
----
@@ -84,7 +140,7 @@ String id = embeddingStore.add(embedding, segment);
84140
// output: id of the embedding
85141
----
86142

87-
Too add embeddings with segment and metadata:
143+
To add embeddings with segment and metadata:
88144
[source,java]
89145
----
90146
TextSegment segment = TextSegment.from(randomUUID(), Metadata.from(METADATA_KEY, "test-value"));
@@ -106,7 +162,8 @@ final List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.search(request
106162
// output: list of embeddings
107163
----
108164

109-
Search embeddings with minScore:
165+
To search embeddings with `minScore`:
166+
110167
[source,java]
111168
----
112169
Embedding embedding = embeddingModel.embed("embedText").content();
@@ -120,12 +177,13 @@ final List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.search(request
120177
// output: list of embeddings
121178
----
122179

123-
Search embeddings with segment with custom metadata prefix:
180+
To search embeddings with segment with custom metadata prefix:
124181
[source,java]
125182
----
126183
String metadataPrefix = "metadata.";
127184
String labelName = "CustomLabelName";
128-
embeddingStore = Neo4jEmbeddingStore.builder()
185+
186+
Neo4jEmbeddingStore embeddingStore = Neo4jEmbeddingStore.builder()
129187
.withBasicAuth(neo4jContainer.getBoltUrl(), USERNAME, ADMIN_PASSWORD)
130188
.dimension(384)
131189
.metadataPrefix(metadataPrefix)
@@ -154,7 +212,7 @@ Search embeddings with segment with metadata and custom id prop:
154212
String metadataPrefix = "metadata.";
155213
String customIdProp = "customId ` & Prop ` To Sanitize";
156214
157-
embeddingStore = Neo4jEmbeddingStore.builder()
215+
Neo4jEmbeddingStore embeddingStore = Neo4jEmbeddingStore.builder()
158216
.withBasicAuth(neo4jContainer.getBoltUrl(), USERNAME, ADMIN_PASSWORD)
159217
.dimension(384)
160218
.metadataPrefix(metadataPrefix)
@@ -215,6 +273,25 @@ final List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.search(request
215273
// output: list of embeddings
216274
----
217275

276+
==== Neo4jText2CypherRetriever
277+
[source,java]
278+
----
279+
// create dataset
280+
// CREATE (book:Book {title: 'Dune'})<-[:WROTE]-(author:Person {name: 'Frank Herbert'})");
281+
Neo4jText2CypherRetriever retriever = Neo4jText2CypherRetriever.builder()
282+
.graph(graph)
283+
.chatLanguageModel(chatLanguageModel)
284+
.build();
285+
286+
Query query = new Query("Who is the author of the book 'Dune'?");
287+
288+
List<Content> contents = retriever.retrieve(query);
289+
290+
System.out.println(contents.get(0).textSegment().text());
291+
// output: "Frank Herbert"
292+
----
293+
294+
218295
== Relevant Links
219296
[cols="1,4"]
220297
|===

0 commit comments

Comments
 (0)