@@ -40,6 +40,181 @@ An example is avalable at: https://github.com/langchain4j/langchain4j-examples/t
4040include::https://github.com/langchain4j/langchain4j-examples/raw/main/neo4j-example/src/main/java/Neo4jEmbeddingStoreExample.java[]
4141----
4242
43+ === Usage Examples
44+
45+ To create a Neo4jEmbeddingStore, we can write:
46+ [source,java]
47+ ----
48+ Neo4jEmbeddingStore embeddingStore = Neo4jEmbeddingStore.builder().<builderParameters>.build();
49+
50+ // where <builderParameters> can be the following:
51+ .dimension(384)
52+ .label(LABEL_TO_SANITIZE)
53+ .build();
54+
55+ // we can use with `withBasicAuth`
56+ .withBasicAuth(neo4jContainer.getBoltUrl(), USERNAME, ADMIN_PASSWORD)
57+ // as alternative to driver:
58+ Driver driver = GraphDatabase.driver(neo4jContainer.getBoltUrl(), AuthTokens.basic(USERNAME, ADMIN_PASSWORD));
59+ ----
60+
61+ To add embeddings, execute:
62+ [source,java]
63+ ----
64+ Embedding embedding = embeddingModel.embed("embedText").content();
65+ String id = embeddingStore.add(embedding);
66+ // output: id of the embedding
67+ ----
68+
69+ To add embeddings with id:
70+ [source,java]
71+ ----
72+ String id = randomUUID();
73+ Embedding embedding = embeddingModel.embed("embedText").content();
74+ embeddingStore.add(id, embedding);
75+ // output: id of the embedding
76+ ----
77+
78+ To add embeddings with segment:
79+ [source,java]
80+ ----
81+ TextSegment segment = TextSegment.from(randomUUID());
82+ Embedding embedding = embeddingModel.embed(segment.text()).content();
83+ String id = embeddingStore.add(embedding, segment);
84+ // output: id of the embedding
85+ ----
86+
87+ Too add embeddings with segment and metadata:
88+ [source,java]
89+ ----
90+ TextSegment segment = TextSegment.from(randomUUID(), Metadata.from(METADATA_KEY, "test-value"));
91+ Embedding embedding = embeddingModel.embed(segment.text()).content();
92+ String id = embeddingStore.add(embedding, segment);
93+ // output: id of the embedding
94+ ----
95+
96+ Search embeddings:
97+ [source,java]
98+ ----
99+ Embedding embedding = embeddingModel.embed("embedText").content();
100+ String id = embeddingStore.add(embedding);
101+ final EmbeddingSearchRequest request = EmbeddingSearchRequest.builder()
102+ .queryEmbedding(embedding)
103+ .maxResults(10)
104+ .build();
105+ final List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.search(request).matches();
106+ // output: list of embeddings
107+ ----
108+
109+ Search embeddings with minScore:
110+ [source,java]
111+ ----
112+ Embedding embedding = embeddingModel.embed("embedText").content();
113+ String id = embeddingStore.add(embedding);
114+ final EmbeddingSearchRequest request = EmbeddingSearchRequest.builder()
115+ .queryEmbedding(embedding)
116+ .maxResults(10)
117+ .minScore(0.15)
118+ .build();
119+ final List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.search(request).matches();
120+ // output: list of embeddings
121+ ----
122+
123+ Search embeddings with segment with custom metadata prefix:
124+ [source,java]
125+ ----
126+ String metadataPrefix = "metadata.";
127+ String labelName = "CustomLabelName";
128+ embeddingStore = Neo4jEmbeddingStore.builder()
129+ .withBasicAuth(neo4jContainer.getBoltUrl(), USERNAME, ADMIN_PASSWORD)
130+ .dimension(384)
131+ .metadataPrefix(metadataPrefix)
132+ .label(labelName)
133+ .indexName("customIdxName")
134+ .build();
135+
136+ String metadataCompleteKey = metadataPrefix + METADATA_KEY;
137+ TextSegment segment = TextSegment.from(randomUUID(), Metadata.from(METADATA_KEY, "test-value"));
138+ Embedding embedding = embeddingModel.embed(segment.text()).content();
139+
140+ String id = embeddingStore.add(embedding, segment);
141+ // output: id of the embedding
142+
143+ final EmbeddingSearchRequest request = EmbeddingSearchRequest.builder()
144+ .queryEmbedding(embedding)
145+ .maxResults(10)
146+ .build();
147+ final List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.search(request).matches();
148+ // output: list of embeddings
149+ ----
150+
151+ Search embeddings with segment with metadata and custom id prop:
152+ [source,java]
153+ ----
154+ String metadataPrefix = "metadata.";
155+ String customIdProp = "customId ` & Prop ` To Sanitize";
156+
157+ embeddingStore = Neo4jEmbeddingStore.builder()
158+ .withBasicAuth(neo4jContainer.getBoltUrl(), USERNAME, ADMIN_PASSWORD)
159+ .dimension(384)
160+ .metadataPrefix(metadataPrefix)
161+ .label("CustomLabelName")
162+ .indexName("customIdxName")
163+ .idProperty(customIdProp)
164+ .build();
165+
166+ String metadataCompleteKey = metadataPrefix + METADATA_KEY;
167+
168+ TextSegment segment = TextSegment.from(randomUUID(), Metadata.from(METADATA_KEY, "test-value"));
169+ Embedding embedding = embeddingModel.embed(segment.text()).content();
170+ String id = embeddingStore.add(embedding, segment);
171+ // output: id of the embedding
172+
173+ final EmbeddingSearchRequest request = EmbeddingSearchRequest.builder()
174+ .queryEmbedding(embedding)
175+ .maxResults(10)
176+ .build();
177+ final List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.search(request).matches();
178+ // output: list of embeddings
179+ ----
180+
181+ Add multiple embeddings
182+ [source,java]
183+ ----
184+ Embedding firstEmbedding = embeddingModel.embed("firstEmbedText").content();
185+ Embedding secondEmbedding = embeddingModel.embed("secondEmbedText").content();
186+ List<String> ids = embeddingStore.addAll(asList(firstEmbedding, secondEmbedding));
187+ // output: list of the embedding ids
188+
189+ final EmbeddingSearchRequest request = EmbeddingSearchRequest.builder()
190+ .queryEmbedding(firstEmbedding)
191+ .maxResults(10)
192+ .build();
193+ final List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.search(request).matches();
194+ // output: list of embeddings
195+ ----
196+
197+ Add multiple embeddings with segments
198+ [source,java]
199+ ----
200+ TextSegment firstSegment = TextSegment.from("firstText");
201+ Embedding firstEmbedding = embeddingModel.embed(firstSegment.text()).content();
202+ TextSegment secondSegment = TextSegment.from("secondText");
203+ Embedding secondEmbedding = embeddingModel.embed(secondSegment.text()).content();
204+
205+ List<String> ids = embeddingStore.addAll(
206+ asList(firstEmbedding, secondEmbedding),
207+ asList(firstSegment, secondSegment)
208+ ); // output: list of the embedding ids
209+
210+ final EmbeddingSearchRequest request = EmbeddingSearchRequest.builder()
211+ .queryEmbedding(firstEmbedding)
212+ .maxResults(10)
213+ .build();
214+ final List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.search(request).matches();
215+ // output: list of embeddings
216+ ----
217+
43218== Relevant Links
44219[cols="1,4"]
45220|===
0 commit comments