From 6ac29ac4bd90375277d614af1c76e3f5f01d86d0 Mon Sep 17 00:00:00 2001
From: zaojiankongli <164828112+zaojiankongli@users.noreply.github.com>
Date: Wed, 3 Jun 2026 15:50:38 +0800
Subject: [PATCH] Add files via upload
---
VectorGraphRag/pom.xml | 103 +++
.../zjkl/vectorgraphrag/VectorGraphRAG.java | 451 +++++++++++++
.../config/VectorGraphRagSettings.java | 110 ++++
.../com/zjkl/vectorgraphrag/graph/Graph.java | 258 ++++++++
.../vectorgraphrag/graph/GraphBuilder.java | 200 ++++++
.../vectorgraphrag/graph/GraphRetriever.java | 237 +++++++
.../zjkl/vectorgraphrag/graph/SubGraph.java | 298 +++++++++
.../vectorgraphrag/graph/SubGraphEntity.java | 22 +
.../vectorgraphrag/graph/SubGraphPassage.java | 22 +
.../graph/SubGraphRelation.java | 25 +
.../vectorgraphrag/llm/AnswerGenerator.java | 45 ++
.../vectorgraphrag/llm/EntityExtractor.java | 82 +++
.../com/zjkl/vectorgraphrag/llm/LLMCache.java | 74 +++
.../zjkl/vectorgraphrag/llm/LLMReranker.java | 180 +++++
.../zjkl/vectorgraphrag/llm/OpenAiClient.java | 281 ++++++++
.../vectorgraphrag/llm/TripletExtractor.java | 107 +++
.../zjkl/vectorgraphrag/model/Document.java | 24 +
.../com/zjkl/vectorgraphrag/model/Entity.java | 31 +
.../vectorgraphrag/model/EvictionResult.java | 19 +
.../model/ExtractionResult.java | 28 +
.../zjkl/vectorgraphrag/model/Passage.java | 23 +
.../vectorgraphrag/model/QueryResult.java | 34 +
.../zjkl/vectorgraphrag/model/Relation.java | 22 +
.../vectorgraphrag/model/RerankResult.java | 20 +
.../vectorgraphrag/model/RetrievalDetail.java | 28 +
.../vectorgraphrag/model/RetrievalResult.java | 43 ++
.../zjkl/vectorgraphrag/model/Triplet.java | 40 ++
.../storage/EmbeddingClient.java | 92 +++
.../vectorgraphrag/storage/MilvusStore.java | 621 ++++++++++++++++++
.../zjkl/vectorgraphrag/VectorGraphRAG.class | Bin 0 -> 21555 bytes
...ttings$VectorGraphRagSettingsBuilder.class | Bin 0 -> 11253 bytes
.../config/VectorGraphRagSettings.class | Bin 0 -> 18214 bytes
.../com/zjkl/vectorgraphrag/graph/Graph.class | Bin 0 -> 12731 bytes
.../vectorgraphrag/graph/GraphBuilder.class | Bin 0 -> 12509 bytes
.../vectorgraphrag/graph/GraphRetriever.class | Bin 0 -> 13763 bytes
.../zjkl/vectorgraphrag/graph/SubGraph.class | Bin 0 -> 14527 bytes
...SubGraphEntity$SubGraphEntityBuilder.class | Bin 0 -> 2922 bytes
.../vectorgraphrag/graph/SubGraphEntity.class | Bin 0 -> 4495 bytes
...bGraphPassage$SubGraphPassageBuilder.class | Bin 0 -> 2933 bytes
.../graph/SubGraphPassage.class | Bin 0 -> 4496 bytes
...raphRelation$SubGraphRelationBuilder.class | Bin 0 -> 3486 bytes
.../graph/SubGraphRelation.class | Bin 0 -> 6052 bytes
.../vectorgraphrag/llm/AnswerGenerator.class | Bin 0 -> 2584 bytes
.../vectorgraphrag/llm/EntityExtractor.class | Bin 0 -> 3979 bytes
.../zjkl/vectorgraphrag/llm/LLMCache.class | Bin 0 -> 4343 bytes
.../zjkl/vectorgraphrag/llm/LLMReranker.class | Bin 0 -> 10963 bytes
.../vectorgraphrag/llm/OpenAiClient.class | Bin 0 -> 13597 bytes
.../vectorgraphrag/llm/TripletExtractor.class | Bin 0 -> 7647 bytes
.../model/Document$DocumentBuilder.class | Bin 0 -> 3145 bytes
.../zjkl/vectorgraphrag/model/Document.class | Bin 0 -> 4761 bytes
.../model/Entity$EntityBuilder.class | Bin 0 -> 2191 bytes
.../zjkl/vectorgraphrag/model/Entity.class | Bin 0 -> 3012 bytes
...EvictionResult$EvictionResultBuilder.class | Bin 0 -> 2321 bytes
.../vectorgraphrag/model/EvictionResult.class | Bin 0 -> 2952 bytes
...actionResult$ExtractionResultBuilder.class | Bin 0 -> 4434 bytes
.../model/ExtractionResult.class | Bin 0 -> 6531 bytes
.../model/Passage$PassageBuilder.class | Bin 0 -> 3156 bytes
.../zjkl/vectorgraphrag/model/Passage.class | Bin 0 -> 5137 bytes
.../QueryResult$QueryResultBuilder.class | Bin 0 -> 5961 bytes
.../vectorgraphrag/model/QueryResult.class | Bin 0 -> 10596 bytes
.../model/Relation$RelationBuilder.class | Bin 0 -> 3181 bytes
.../zjkl/vectorgraphrag/model/Relation.class | Bin 0 -> 5173 bytes
.../RerankResult$RerankResultBuilder.class | Bin 0 -> 2533 bytes
.../vectorgraphrag/model/RerankResult.class | Bin 0 -> 3639 bytes
...trievalDetail$RetrievalDetailBuilder.class | Bin 0 -> 4158 bytes
.../model/RetrievalDetail.class | Bin 0 -> 6518 bytes
...trievalResult$RetrievalResultBuilder.class | Bin 0 -> 7200 bytes
.../model/RetrievalResult.class | Bin 0 -> 11503 bytes
.../model/Triplet$TripletBuilder.class | Bin 0 -> 1840 bytes
.../zjkl/vectorgraphrag/model/Triplet.class | Bin 0 -> 2825 bytes
.../storage/EmbeddingClient.class | Bin 0 -> 4729 bytes
.../vectorgraphrag/storage/MilvusStore.class | Bin 0 -> 34069 bytes
.../compile/default-compile/createdFiles.lst | 43 ++
.../compile/default-compile/inputFiles.lst | 28 +
74 files changed, 3591 insertions(+)
create mode 100644 VectorGraphRag/pom.xml
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/VectorGraphRAG.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/config/VectorGraphRagSettings.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/graph/Graph.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/graph/GraphBuilder.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/graph/GraphRetriever.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/graph/SubGraph.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/graph/SubGraphEntity.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/graph/SubGraphPassage.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/graph/SubGraphRelation.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/llm/AnswerGenerator.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/llm/EntityExtractor.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/llm/LLMCache.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/llm/LLMReranker.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/llm/OpenAiClient.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/llm/TripletExtractor.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/model/Document.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/model/Entity.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/model/EvictionResult.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/model/ExtractionResult.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/model/Passage.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/model/QueryResult.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/model/Relation.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/model/RerankResult.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/model/RetrievalDetail.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/model/RetrievalResult.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/model/Triplet.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/storage/EmbeddingClient.java
create mode 100644 VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/storage/MilvusStore.java
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/VectorGraphRAG.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/config/VectorGraphRagSettings$VectorGraphRagSettingsBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/config/VectorGraphRagSettings.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/graph/Graph.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/graph/GraphBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/graph/GraphRetriever.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/graph/SubGraph.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/graph/SubGraphEntity$SubGraphEntityBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/graph/SubGraphEntity.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/graph/SubGraphPassage$SubGraphPassageBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/graph/SubGraphPassage.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/graph/SubGraphRelation$SubGraphRelationBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/graph/SubGraphRelation.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/llm/AnswerGenerator.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/llm/EntityExtractor.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/llm/LLMCache.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/llm/LLMReranker.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/llm/OpenAiClient.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/llm/TripletExtractor.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/Document$DocumentBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/Document.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/Entity$EntityBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/Entity.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/EvictionResult$EvictionResultBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/EvictionResult.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/ExtractionResult$ExtractionResultBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/ExtractionResult.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/Passage$PassageBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/Passage.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/QueryResult$QueryResultBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/QueryResult.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/Relation$RelationBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/Relation.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/RerankResult$RerankResultBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/RerankResult.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/RetrievalDetail$RetrievalDetailBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/RetrievalDetail.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/RetrievalResult$RetrievalResultBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/RetrievalResult.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/Triplet$TripletBuilder.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/model/Triplet.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/storage/EmbeddingClient.class
create mode 100644 VectorGraphRag/target/classes/com/zjkl/vectorgraphrag/storage/MilvusStore.class
create mode 100644 VectorGraphRag/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
create mode 100644 VectorGraphRag/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
diff --git a/VectorGraphRag/pom.xml b/VectorGraphRag/pom.xml
new file mode 100644
index 0000000..c28d0b1
--- /dev/null
+++ b/VectorGraphRag/pom.xml
@@ -0,0 +1,103 @@
+
+
+ 4.0.0
+
+ com.zjkl
+ vector-graph-rag
+ 0.1.0
+ jar
+ Vector Graph RAG
+ Graph RAG using pure vector search with Milvus
+
+
+ 21
+ 21
+ 21
+ UTF-8
+ 3.5.11
+ 2.6.18
+ 2.13.2
+ 3.2.0
+ 1.18.44
+ 2.0.17
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+ io.milvus
+ milvus-sdk-java
+ ${milvus-sdk.version}
+
+
+
+ com.google.code.gson
+ gson
+ ${gson.version}
+
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+ ${caffeine.version}
+
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.14.0
+
+ 21
+ 21
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+
+
+
+
+
diff --git a/VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/VectorGraphRAG.java b/VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/VectorGraphRAG.java
new file mode 100644
index 0000000..8cba48a
--- /dev/null
+++ b/VectorGraphRag/src/main/java/com/zjkl/vectorgraphrag/VectorGraphRAG.java
@@ -0,0 +1,451 @@
+package com.zjkl.vectorgraphrag;
+
+import com.zjkl.vectorgraphrag.config.VectorGraphRagSettings;
+import com.zjkl.vectorgraphrag.graph.Graph;
+import com.zjkl.vectorgraphrag.graph.GraphBuilder;
+import com.zjkl.vectorgraphrag.graph.GraphRetriever;
+import com.zjkl.vectorgraphrag.graph.SubGraph;
+import com.zjkl.vectorgraphrag.llm.AnswerGenerator;
+import com.zjkl.vectorgraphrag.llm.EntityExtractor;
+import com.zjkl.vectorgraphrag.llm.LLMCache;
+import com.zjkl.vectorgraphrag.llm.LLMReranker;
+import com.zjkl.vectorgraphrag.llm.OpenAiClient;
+import com.zjkl.vectorgraphrag.llm.TripletExtractor;
+import com.zjkl.vectorgraphrag.model.*;
+import com.zjkl.vectorgraphrag.storage.EmbeddingClient;
+import com.zjkl.vectorgraphrag.storage.MilvusStore;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Vector Graph RAG - Graph RAG using pure vector search with Milvus.
+ *
+ * Main entry point for building and querying a Graph RAG system.
+ * Implements the full pipeline: triplet extraction → graph building →
+ * embedding → Milvus indexing → multi-way retrieval → subgraph expansion →
+ * LLM reranking → answer generation.
+ *
+ * Example:
+ *
{@code
+ * VectorGraphRagSettings settings = VectorGraphRagSettings.builder()
+ * .openaiApiKey(System.getenv("OPENAI_API_KEY"))
+ * .milvusUri("./my_graph.db")
+ * .build();
+ *
+ * VectorGraphRAG rag = new VectorGraphRAG(settings);
+ *
+ * rag.addTexts(List.of(
+ * "Albert Einstein developed the theory of relativity.",
+ * "The theory of relativity revolutionized physics."
+ * ));
+ *
+ * QueryResult result = rag.query("What did Einstein develop?");
+ * System.out.println(result.getAnswer());
+ * }
+ */
+@Slf4j
+public class VectorGraphRAG {
+
+ private final VectorGraphRagSettings settings;
+
+ private final EmbeddingClient embeddingClient;
+ private final MilvusStore store;
+ private final GraphBuilder graphBuilder;
+ private final TripletExtractor tripletExtractor;
+ private final EntityExtractor entityExtractor;
+ private final LLMReranker reranker;
+ private final AnswerGenerator answerGenerator;
+ private final LLMCache llmCache;
+ private final OpenAiClient openAiClient;
+ private final Graph graph;
+
+ @Getter
+ private GraphRetriever retriever;
+
+ @Getter
+ private ExtractionResult extractionResult;
+
+ /**
+ * Create VectorGraphRAG with custom settings.
+ */
+ public VectorGraphRAG(VectorGraphRagSettings settings) {
+ this.settings = settings;
+ this.llmCache = settings.isUseLlmCache() ? new LLMCache() : null;
+ this.openAiClient = new OpenAiClient(settings, llmCache);
+ this.embeddingClient = new EmbeddingClient(settings, openAiClient);
+ this.store = new MilvusStore(settings, embeddingClient);
+ this.graphBuilder = new GraphBuilder(settings);
+ this.tripletExtractor = new TripletExtractor(settings, openAiClient);
+ this.entityExtractor = new EntityExtractor(settings, openAiClient);
+ this.reranker = new LLMReranker(settings, openAiClient);
+ this.answerGenerator = new AnswerGenerator(settings, openAiClient);
+ this.graph = new Graph(settings, store, embeddingClient);
+
+ // Create collections if they don't exist
+ store.createCollections(false);
+ }
+
+ /**
+ * Create VectorGraphRAG with default settings (reads OPENAI_API_KEY from environment).
+ */
+ public static VectorGraphRAG createDefault() {
+ VectorGraphRagSettings settings = VectorGraphRagSettings.builder()
+ .openaiApiKey(System.getenv().getOrDefault("OPENAI_API_KEY", ""))
+ .build();
+ return new VectorGraphRAG(settings);
+ }
+
+ // ==================== Indexing ====================
+
+ /**
+ * Add text strings to the knowledge base.
+ */
+ public ExtractionResult addTexts(List texts) {
+ return addTexts(texts, null, true);
+ }
+
+ /**
+ * Add text strings with extraction control.
+ */
+ public ExtractionResult addTexts(List texts, List ids, boolean extractTriplets) {
+ List documents = new ArrayList<>();
+ for (int i = 0; i < texts.size(); i++) {
+ String docId = (ids != null && i < ids.size()) ? ids.get(i) : UUID.randomUUID().toString();
+ documents.add(Document.builder()
+ .id(docId)
+ .text(texts.get(i))
+ .build());
+ }
+ return addDocuments(documents, extractTriplets, true);
+ }
+
+ /**
+ * Add Document objects to the knowledge base.
+ * Full indexing pipeline: extract triplets → build graph → embed → index in Milvus.
+ */
+ public ExtractionResult addDocuments(List documents, boolean extractTriplets, boolean showProgress) {
+ // Ensure all documents have IDs
+ for (Document doc : documents) {
+ if (doc.getId() == null) {
+ doc.setId(UUID.randomUUID().toString());
+ }
+ }
+
+ // Extract triplets
+ if (extractTriplets) {
+ documents = tripletExtractor.extractFromDocuments(documents, showProgress);
+ }
+
+ // Build graph
+ this.extractionResult = graphBuilder.buildFromDocuments(documents);
+
+ // Generate embeddings
+ if (showProgress) log.info("Generating embeddings...");
+
+ List entityTexts = graphBuilder.getEntityTexts();
+ List relationTexts = graphBuilder.getRelationTexts();
+ List passageTexts = graphBuilder.getPassageTexts();
+
+ List> entityEmbeddings = entityTexts.isEmpty() ? List.of()
+ : embeddingClient.embedBatch(entityTexts, showProgress);
+ List> relationEmbeddings = relationTexts.isEmpty() ? List.of()
+ : embeddingClient.embedBatch(relationTexts, showProgress);
+ List> passageEmbeddings = passageTexts.isEmpty() ? List.of()
+ : embeddingClient.embedBatch(passageTexts, showProgress);
+
+ // Build metadata for adjacency
+ List