langchain对neo4j进行交互,写入和查询数据 / ai #53

Words
159
Reading
1 min
Listen
Play
3M

对neo4j有了基本了解,就可以上手实操啰。这里采用langchain的集成方案,写入和查询都集成得很好,几条命令就可搞定。

写入数据

# 安装包
pip install langchain -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install langchain-openai langchain-community langchain-experimental
pip install langchain-neo4j

from langchain_core.documents import Document
from dotenv import dotenv_values
from langchain_openai import ChatOpenAI
from langchain_neo4j import Neo4jGraph
from langchain_experimental.graph_transformers import LLMGraphTransformer


env_vars = dotenv_values('.env')
OPENAI_KEY = env_vars['OPENAI_API_KEY'] 
OPENAI_BASE_URL = env_vars['OPENAI_API_BASE'] 


# 打开文件,并赋予读取模式 'r' 
def readTxt():
    with open('./ball.txt', 'r', encoding='gbk') as file:
        content = file.read()
        documents = [Document(page_content=content)]
        #print(123, documents)
        return documents

# 创建图数据库实例
graph = Neo4jGraph(url='neo4j+s://a2f9xcxx.databases.neo4j.io', 
      username="a2f9xxxx", 
      password="gh7EJn9Ik1xxxxx.xx",
      database="a2f9xxxx"
)  

graph_llm = ChatOpenAI(temperature=0, model_name="gpt-5.4-mini", api_key=OPENAI_KEY, base_url=OPENAI_BASE_URL)

# 图转换器配置
graph_transformer = LLMGraphTransformer(llm=graph_llm)  #可以使用默认设置
"""
#或者是添加节点和关系边
graph_transformer = LLMGraphTransformer(
    llm=graph_llm,
    allowed_nodes=["", "", "16"],    # 可以自定义节点
    allowed_relationships=["", "", "", ""],  # 可以自定义关系
)
"""

documents = readTxt()
graph_documents = graph_transformer.convert_to_graph_documents(documents)
graph.add_graph_documents(graph_documents)  

print(f"Graph documents: {len(graph_documents)}")
print(f"Nodes from 1st graph doc:{graph_documents[0].nodes}")
print(f"Relationships from 1st graph doc:{graph_documents[0].relationships}")

neo4j3.jpg

neo4j4.jpg

写入后的数据如图所示

以世界杯的数据来作测试。使用了langchain的默认配置。从图中可以看出,langchain可以很好地默认提取出节点和关系,快速写入图数据库中。当然也可以定义好节点和边的关系,可操作性可能会更好些。

查询数据

from langchain_core.documents import Document
from dotenv import dotenv_values
from langchain_openai import ChatOpenAI
from langchain_neo4j import Neo4jGraph
from langchain_experimental.graph_transformers import LLMGraphTransformer
from langchain_neo4j import GraphCypherQAChain


env_vars = dotenv_values('.env')
OPENAI_KEY = env_vars['OPENAI_API_KEY'] 
OPENAI_BASE_URL = env_vars['OPENAI_API_BASE'] 


# 创建图数据库实例
graph = Neo4jGraph(url='neo4j+s://a2f9xcxx.databases.neo4j.io', 
      username="a2f9xxxx", 
      password="gh7EJn9Ik1xxxxx.xx",
      database="a2f9xxxx"
)

graph_llm = ChatOpenAI(temperature=0, model_name="gpt-5.4-mini", api_key=OPENAI_KEY, base_url=OPENAI_BASE_URL)

cypher_chain = GraphCypherQAChain.from_llm(
    graph=graph,
    cypher_llm=graph_llm,
    qa_llm=graph_llm,
    validate_cypher=True, 
    verbose=True,
    allow_dangerous_requests=True
)

response = cypher_chain.invoke({"query": "I组有哪些队"})
# response = cypher_chain.invoke({"query": "美国在哪个小组"})
print(response["result"])
"""
> Entering new GraphCypherQAChain chain...
Generated Cypher:
MATCH (g:Group {id: 'I组'})-[:HAS_TEAM]->(c:Country)
RETURN c.id AS team
Full Context:
[{'team': '法国'}, {'team': '塞内加尔'}, {'team': '伊拉克'}, {'team': '挪威'}]
> Finished chain.
I组有法国、塞内加尔、伊拉克和挪威。
"""

附测试数据:

20264812A-L西

:
1. 西
2. 

A-L
- A西
- B
- C西
- D
- E
- F
- G西
- H西
- I
- J
- K
- L


- 124832
- 32-16-8--
- 10439612720
- 2026
langchain对neo4j进行交互,写入和查询数据 / ai #53 | Ecency