代码说明:
-
连接 Neo4j 数据库:
- 使用
py2neo.Graph
连接到 Neo4j 数据库。 - 确保替换
uri
、username
和password
为你的实际配置。
- 使用
-
Cypher 查询:
- 查询数据库中的节点和关系,限制返回的记录数(例如
LIMIT 100
)以避免性能问题。
- 查询数据库中的节点和关系,限制返回的记录数(例如
-
NetworkX 图对象:
- 使用
networkx.MultiDiGraph
创建一个有向图对象。 - 将查询结果中的节点和关系添加到图中。
- 使用
-
绘制图形:
- 使用
matplotlib
和networkx
的绘图功能,将图谱可视化。 - 节点和边的标签可以根据需要调整。
- 使用
bash
from py2neo import Graph
import networkx as nx
import matplotlib.pyplot as plt
# 1. 连接到 Neo4j 数据库
uri = "bolt://localhost:7687" # 替换为你的 Neo4j URI
username = "neo4j" # 替换为你的用户名
password = "password" # 替换为你的密码
graph = Graph(uri, auth=(username, password))
# 2. 使用 Cypher 查询获取节点和关系
query = """
MATCH (n)-[r]->(m)
RETURN n, r, m
LIMIT 100
"""
results = graph.run(query)
# 3. 创建 NetworkX 图对象
G = nx.MultiDiGraph()
# 4. 将查询结果添加到 NetworkX 图中
for record in results:
source = record["n"]
target = record["m"]
relation = record["r"]
# 添加节点(如果节点已经有标签或属性,可以提取出来)
G.add_node(source.identity, label=source['name'] if 'name' in source else "")
G.add_node(target.identity, label=target['name'] if 'name' in target else "")
# 添加边(关系)
G.add_edge(source.identity, target.identity, label=relation.type)
# 5. 绘制图形
plt.figure(figsize=(12, 8))
# 设置布局
pos = nx.spring_layout(G, seed=42)
# 绘制节点
nx.draw_networkx_nodes(G, pos, node_size=300, node_color="lightblue")
# 绘制边
nx.draw_networkx_edges(G, pos, arrows=True)
# 绘制节点标签
node_labels = {node_id: G.nodes[node_id].get("label", "") for node_id in G.nodes()}
nx.draw_networkx_labels(G, pos, labels=node_labels, font_size=10)
# 绘制边标签
edge_labels = {(u, v): G[u][v][0]['label'] for u, v in G.edges()}
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=8)
# 显示图形
plt.title("Neo4j 图谱可视化")
plt.axis("off") # 关闭坐标轴
plt.show()
输出示例:
运行上述代码后,你将看到一个可视化的图谱,其中:
- 节点表示 Neo4j 中的实体。
- 边表示实体之间的关系。
- 节点和边的标签显示了它们的名称或类型。