neo4j同时使用嵌入模式和服务模式

原文链接

http://blog.wowtools.org/2019/12/27/2019-12-27-custom-neo4j1/

 

 

---
layout: post
title:  "neo4j同时使用嵌入模式和服务模式"
categories: neo4j java
tags:  neo4j扩展开发
author: 刘雨
---

neo4j(社区版)有两种模式:嵌入模式和服务器模式,下图描述了它们的使用区别,简单来说,嵌入模式就是直接用java代码去操作,服务器模式就是通过暴露出来的web端口传入查询语句等进行操作。
![嵌入模式与服务器模式对比](/myimgs/20191227/1.jpg)

两种模式哪种更优?网上有太多的帖子讨论这个。可是,毕竟只有小孩子才做选择题,我们为什么不选择全都要呢O(∩_∩)O

话不多说,直接上代码

1、引入maven依赖:
```
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j</artifactId>
            <version>3.4.9</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j.app</groupId>
            <artifactId>neo4j-server</artifactId>
            <version>3.4.9</version>
        </dependency>
```

2、拷贝一个neo4j.conf文件,按官方文档进行自己需要的配置,值得注意的是此处:
```
#数据文件存放位置
dbms.directories.data=D:/data/test
```

3、编写初始化代码
```
    private static final ServerBootstrapper serverBootstrapper;
    private static final String dbPath;
    private static final GraphDatabaseService graphDb;
    ...
        //读neo4j.conf的配置
        Properties p = new Properties();
        try {
            p.load(ResourcesReader.readStream(Neo4jDbManager.class, "neo4j.conf"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        dbPath = p.getProperty("dbms.directories.data");

        File storeDir = new File(dbPath);

        serverBootstrapper = new CommunityBootstrapper();
        String cfgFilePath = ResourcesReader.getClassRootPath(Neo4jDbManager.class) +
                "/neo4j.conf";
        //社区版的bug,部分属性无法直接从配置文件写入(例如7474端口号),手动覆盖一下
        Optional<File> cfgFile = Optional.of(new File(cfgFilePath));
        Set<String>  cfgKeys = p.stringPropertyNames();
        Map<String, String> configOverrides = new HashMap<>(cfgKeys.size());
        for (String cfgKey : cfgKeys) {//把所有配置都读到map里,解决默认端口无法修改的问题
            configOverrides.put(cfgKey, p.getProperty(cfgKey));
        }
        
        //启动服务端模式
        serverBootstrapper.start(storeDir, cfgFile, configOverrides);
        NeoServer neoServer = serverBootstrapper.getServer();
        //获取内嵌模式db对象
        graphDb = neoServer.getDatabase().getGraph();
```
其中,ResourcesReader是我自己写的一个工具类,负责从相对路径读取配置文件,要用的话需要引入这个maven,你也可以自己写一个来替换它~
```
        <dependency>
            <groupId>org.wowtools</groupId>
            <artifactId>catframe-common</artifactId>
            <version>1.4.2</version>
        </dependency>
```

4、使用服务端模式和内嵌模式
当初始化完成后,服务模式已经在neo4j.conf配置的端口启动了,你可以在localhost:7474(默认端口是这个)这个可视化界面打开看到。

至于内嵌模式,因为前面我们已经拿到db对象了,可以任意利用java api去操作了,比如:
```
        Transaction tx = graphDb.beginTx();//记得起事务和关闭事务
        try {
            graphDb.findNodes(Label.label("xxx"),"name","小明").forEachRemaining((node)->{
                System.out.println(node.getProperty("age"));
            });
        } finally {
            tx.close();

        }
```

好了,同时享受内嵌模式的高性能和服务端模式的快捷吧~
下一节我们将介绍如何把java方法暴露成自定义函数在服务端模式调用,让你将二者结合应用的更得心应手。

使用 LangChain 和 Neo4j 实现图向量数据库,可以通过以下步骤构建一个基于向量索引的图数据库应用,从而实现高效的数据检索与增强的语义查询能力。 ### 1. 环境配置与依赖安装 在开始之前,需要确保已经安装了必要的库和配置了相关的环境变量。具体包括: - 安装 LangChain、Neo4j 驱动程序和 OpenAI 的嵌入模型支持: ```bash pip install langchain neo4j openai ``` - 设置必要的环境变量,包括 OpenAI API 密钥以及 Neo4j 的连接信息: ```bash OPENAI_API_KEY=<your_openai_api_key> NEO4J_URI=<your_neo4j_uri> NEO4J_USERNAME=<your_neo4j_username> NEO4J_PASSWORD=<your_neo4j_password> ``` 这些配置将确保 LangChain 能够与 Neo4j 进行交互,并利用 OpenAI 的嵌入模型生成文本向量[^2]。 ### 2. 文档导入与向量索引创建 LangChain 提供了简便的接口用于将文档导入 Neo4j 并创建向量索引。以下是一个基本的实现流程: - **加载文档**:使用 LangChain 提供的文档加载器(如 `DirectoryLoader` 或 `TextLoader`)读取文本数据。 - **文本分割**:使用 `RecursiveCharacterTextSplitter` 将长文本分割为适合嵌入模型处理的小块。 - **生成嵌入向量**:使用 OpenAI 的 `OpenAIEmbeddings` 模型将文本块转换为向量。 - **导入 Neo4j 并创建向量索引**:通过 `Neo4jVector` 类将文本向量存储到 Neo4j 中,并自动创建向量索引以支持高效检索。 代码示例如下: ```python from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Neo4jVector # 加载文档 loader = TextLoader("path/to/your/document.txt") documents = loader.load() # 分割文本 text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) docs = text_splitter.split_documents(documents) # 生成嵌入向量 embeddings = OpenAIEmbeddings() # 将文档导入 Neo4j 并创建向量索引 vectorstore = Neo4jVector.from_documents( documents=docs, embedding=embeddings, url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD, ) ``` ### 3. 向量检索与混合搜索 在构建完向量索引后,可以通过向量相似性搜索快速检索与查询语义相近的文档。此外,Neo4j 还支持将向量搜索与图结构查询结合,实现混合搜索模式。例如,可以先通过图结构查找相关节点,再结合向量相似性进行排序和筛选,从而提升检索的准确性和效率[^4]。 ### 4. 整合到 RAG 应用中 将 Neo4j 向量数据库与 LangChain 的检索增强生成(RAG)功能结合,可以构建一个强大的问答系统。具体流程如下: - **检索**:使用向量搜索从 Neo4j 中检索与用户查询最相关的文档。 - **增强**:将检索到的文档内容作为上下文提供给语言模型。 - **生成**:使用语言模型(如 GPT)生成最终的回答。 LangChain 提供了 `RetrievalQA` 链,可以方便地将检索器与生成模型集成[^1]。 示例代码如下: ```python from langchain.chains import RetrievalQA from langchain.chat_models import ChatOpenAI # 创建检索器 retriever = vectorstore.as_retriever() # 创建问答链 qa_chain = RetrievalQA.from_chain_type( llm=ChatOpenAI(), chain_type="stuff", retriever=retriever, return_source_documents=True ) # 执行查询 query = "你的问题在这里" result = qa_chain({"query": query}) print(result["result"]) ``` ### 5. 自定义与扩展 对于更复杂的场景,Neo4j 提供了丰富的自定义选项。例如,可以通过 Cypher 查询语言定义更复杂的图结构,或在向量索引的基础上构建多层检索策略。此外,还可以结合图神经网络(GNN)等技术进一步优化检索效果[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值