从 Neo4j 数据库中提取数据并绘制图谱

发布于:2025-03-27 ⋅ 阅读:(94) ⋅ 点赞:(0)

    代码说明:

    1. 连接 Neo4j 数据库

      • 使用 py2neo.Graph 连接到 Neo4j 数据库。
      • 确保替换 uriusername 和 password 为你的实际配置。
    2. Cypher 查询

      • 查询数据库中的节点和关系,限制返回的记录数(例如 LIMIT 100)以避免性能问题。
    3. NetworkX 图对象

      • 使用 networkx.MultiDiGraph 创建一个有向图对象。
      • 将查询结果中的节点和关系添加到图中。
    4. 绘制图形

      • 使用 matplotlib 和 networkx 的绘图功能,将图谱可视化。
      • 节点和边的标签可以根据需要调整。

    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 中的实体。
    • 边表示实体之间的关系。
    • 节点和边的标签显示了它们的名称或类型。