Knowledge Graphs for RAG – Query Knowledge Graphs (吴恩达)
1导包并配置Neo4
from dotenv import load_dotenv
import os
from langchain_community.graphs import Neo4jGraph
# Warning control
import warnings
warnings.filterwarnings("ignore")
load_dotenv('.env', override=True)
NEO4J_URI = os.getenv('NEO4J_URI')#Neo4j的链接字符串,指明Neoc4j 运行于哪个端口
NEO4J_USERNAME = os.getenv('NEO4J_USERNAME')#用户名
NEO4J_PASSWORD = os.getenv('NEO4J_PASSWORD')#密码
NEO4J_DATABASE = os.getenv('NEO4J_DATABASE')#在DBMS中要使用的数据库名
1.1 使用LangChain的Neo4j初始化一个知识图谱实例
kg = Neo4jGraph(
url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD, database=NEO4J_DATABASE
)
1.2 查询电影知识图谱
1.2.1 简单实例:人和电影的关系
1.2.2 匹配图形中的所有节点
# 查询图谱中的总节点数
cypher = """
MATCH (n)
RETURN count(n)
"""
result = kg.query(cypher)
result
给 count(n) 新的命名使其显示更优雅
cypher = """
MATCH (n)
RETURN count(n) AS numberOfNodes
"""
1.2.3 通过指定节点标签仅匹配电影节点
cypher = """
MATCH (n:Movie)
RETURN count(n) AS numberOfMovies
"""
kg.query(cypher)
换个节点模式匹配中变量名增加可读性(movie 首字母是m,所以我们可以把n变量换成m)
1.2.4 通过在“person
”节点上指定name
属性的值来匹配单个个人
cypher = """
MATCH (tom:Person {name:"Tom Hanks"})
RETURN tom
"""
kg.query(cypher)
通过指定title
属性的值来匹配单个Movie
cypher = """
MATCH (cloudAtlas:Movie {title:"Cloud Atlas"})
RETURN cloudAtlas
"""
kg.query(cypher)
如果不想返回整个cloudAtlas
节点,而是只想要发行日(released
):
cypher = """
MATCH (cloudAtlas:Movie {title:"Cloud Atlas"})
RETURN cloudAtlas.released
"""
kg.query(cypher)
想要多个属性值时:
cypher = """
MATCH (cloudAtlas:Movie {title:"Cloud Atlas"})
RETURN cloudAtlas.released, cloudAtlas.tagline
"""
kg.query(cypher)
1.2.5 具有条件匹配的Cypher模式
cypher = """
MATCH (nineties:Movie)
WHERE nineties.released >= 1990
AND nineties.released < 2000
RETURN nineties.title
"""
1.3 多节点+关系的模式匹配
cypher = """
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)
RETURN actor.name, movie.title LIMIT 10
"""
kg.query(cypher)
只查询某个名字的演员参演的电影及演员全名
cypher = """
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies:Movie)
RETURN tom.name,tomHanksMovies.title
"""
kg.query(cypher)
查询与演员 ‘Tom Hanks’ 共同出演电影的演员名字及电影名字
# 两个node 变量: m 和 coActors, 先由Tom Hanks 查出m, 然后查出m 中的其他演员 coActors
cypher = """
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors)
RETURN coActors.name, m.title
"""
kg.query(cypher)
1.4 删除数据
# 查询Emil Eifrem 演过的电影及Emil Eifrem名字
cypher = """
MATCH (emil:Person {name:"Emil Eifrem"})-[actedIn:ACTED_IN]->(movie:Movie)
RETURN emil.name, movie.title
"""
kg.query(cypher)
# 删除 '演出' 关系
cypher = """
MATCH (emil:Person {name:"Emil Eifrem"})-[actedIn:ACTED_IN]->(movie:Movie)
DELETE actedIn
"""
kg.query(cypher)
1.5 添加数据
# 创建(CREATE) Person节点(andreas)
cypher = """
CREATE (andreas:Person {name:"Andreas"})
RETURN andreas
"""
kg.query(cypher)
#先查询出andreas 和emil ,然后创建(MERGE )同事关系
cypher = """
MATCH (andreas:Person {name:"Andreas"}), (emil:Person {name:"Emil Eifrem"})
MERGE (andreas)-[hasRelationship:WORKS_WITH]->(emil)
RETURN andreas, hasRelationship, emil
"""
kg.query(cypher)