图数据库 - Neo4j 的 Py2neo 使用

使用 Py2neo 与 Neo4j 进行高级图数据库操作

Neo4j 是一种高性能的、基于图形数据库的数据库管理系统,通过节点、关系和属性来存储和表示数据,特别适合处理高度互联的数据。Py2neo 是一个用于在 Python 中与 Neo4j 进行交互的库。本文将详细介绍如何使用 Py2neo 进行各种高级图数据库操作,包括索引与约束、事务处理、批量操作、图算法、与 Pandas 的集成,以及 NodeMatcher 和 RelationshipMatcher 的使用。

目录
  1. 安装 Py2neo
  2. 基本操作
  3. 索引与约束
  4. 事务处理
  5. 批量操作
  6. 图算法
  7. 与 Pandas 集成
  8. NodeMatcher 和 RelationshipMatcher
  9. 实例:创建和查询电影数据库
  10. 总结

安装 Py2neo

首先,你需要安装 Neo4j 和 Py2neo。在终端或命令行中运行以下命令来安装 Py2neo:

pip install py2neo

基本操作

连接到 Neo4j 数据库
from py2neo import Graph

graph = Graph("bolt://localhost:7687", auth=("username", "password"))
创建节点和关系
from py2neo import Node, Relationship

alice = Node("Person", name="Alice")
bob = Node("Person", name="Bob")
friendship = Relationship(alice, "FRIEND", bob)
graph.create(friendship)

运行结果:

  • 创建了两个节点 Alice 和 Bob,并创建了 Alice 和 Bob 之间的 FRIEND 关系。
执行 Cypher 查询
query = "MATCH (p:Person) RETURN p"
results = graph.run(query)

for record in results:
    print(record)

运行结果:

  • 查询并返回所有 Person 标签的节点。
更新和删除节点
alice["age"] = 30
graph.push(alice)

graph.delete(friendship)
graph.delete(alice)
graph.delete(bob)

运行结果:

  • 更新了 Alice 节点的 age 属性为 30。
  • 删除了 Alice 和 Bob 之间的 FRIEND 关系。
  • 删除了 Alice 和 Bob 节点。

索引与约束

创建唯一性约束
graph.run("CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE")

运行结果:

  • 创建了一个唯一性约束,确保 Person 标签的节点的 name 属性唯一。
删除唯一性约束
graph.run("DROP CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE")

运行结果:

  • 删除了 Person 标签的节点的 name 属性唯一性约束。

事务处理

在处理复杂操作时,使用事务可以确保操作的原子性。

from py2neo import Graph

graph = Graph("bolt://localhost:7687", auth=("username", "password"))

with graph.begin() as tx:
    alice = Node("Person", name="Alice")
    bob = Node("Person", name="Bob")
    friendship = Relationship(alice, "FRIEND", bob)
    
    tx.create(alice)
    tx.create(bob)
    tx.create(friendship)

运行结果:

  • 在一个事务中创建了 Alice 和 Bob 节点,以及他们之间的 FRIEND 关系,确保操作的原子性。

批量操作

在处理大量数据时,可以使用 Py2neo 的 create 方法一次性插入多个节点和关系。

from py2neo import Node, Relationship

nodes = [
    Node("Person", name="Alice"),
    Node("Person", name="Bob"),
    Node("Person", name="Carol")
]

relationships = [
    Relationship(nodes[0], "FRIEND", nodes[1]),
    Relationship(nodes[1], "FRIEND", nodes[2])
]

graph.create(*nodes)
graph.create(*relationships)

运行结果:

  • 批量创建了多个节点(Alice、Bob、Carol)和他们之间的 FRIEND 关系。

图算法

Neo4j 提供了一些内置的图算法,如最短路径、PageRank 等。可以通过 Cypher 查询来执行这些算法。

最短路径
query = """
MATCH (start:Person {name: 'Alice'}), (end:Person {name: 'Carol'}),
p = shortestPath((start)-[*]-(end))
RETURN p
"""
result = graph.run(query)
path = result.evaluate()
print(path)

运行结果:

  • 查询 Alice 和 Carol 之间的最短路径并返回。
PageRank
query = """
CALL algo.pageRank.stream('Person', 'FRIEND', {iterations:20, dampingFactor:0.85})
YIELD nodeId, score
RETURN algo.getNodeById(nodeId).name AS name, score
ORDER BY score DESC
"""
results = graph.run(query)
for record in results:
    print(f"{record['name']}: {record['score']}")

运行结果:

  • 计算并返回所有 Person 节点的 PageRank 分数。

与 Pandas 集成

可以将查询结果直接导入 Pandas DataFrame,以便进一步分析和处理。

import pandas as pd

query = "MATCH (p:Person) RETURN p.name AS name, p.age AS age"
data = graph.run(query).to_data_frame()

print(data.head())

运行结果:

  • 将查询结果导入 Pandas DataFrame 并显示前几行数据。

NodeMatcher 和 RelationshipMatcher

NodeMatcher 和 RelationshipMatcher 是 Py2neo 中用于查找节点和关系的工具。

使用 NodeMatcher 查找节点
from py2neo import NodeMatcher

matcher = NodeMatcher(graph)
alice = matcher.match("Person", name="Alice").first()
print(alice)

运行结果:

  • 查找到 name 为 Alice 的 Person 节点并返回。
使用 RelationshipMatcher 查找关系
from py2neo import RelationshipMatcher

matcher = RelationshipMatcher(graph)
friendship = matcher.match((alice, None), "FRIEND").first()
print(friendship)

运行结果:

  • 查找到 Alice 与其他节点之间的 FRIEND 关系并返回。
多条件查询
friendship = matcher.match((alice, None), "FRIEND").where("_.since > 2020").first()
print(friendship)

运行结果:

  • 查找到 Alice 与其他节点之间的 FRIEND 关系,并且关系的 since 属性大于 2020。

实例:创建和查询电影数据库

假设我们要创建一个电影数据库,其中包括电影和演员,以及他们之间的关系。

from py2neo import Graph, Node, Relationship

graph = Graph("bolt://localhost:7687", auth=("username", "password"))

matrix = Node("Movie", title="The Matrix", released=1999)
john_wick = Node("Movie", title="John Wick", released=2014)

keanu = Node("Actor", name="Keanu Reeves")

acted_in_matrix = Relationship(keanu, "ACTED_IN", matrix, role="Neo")
acted_in_john_wick = Relationship(keanu, "ACTED_IN", john_wick, role="John Wick")

graph.create(matrix | john_wick | keanu | acted_in_matrix | acted_in_john_wick)

query = """
MATCH (a:Actor {name: 'Keanu Reeves'})-[:ACTED_IN]->(m:Movie)
RETURN m.title AS title, m.released AS released
"""
results = graph.run(query)

for record in results:
    print(f"Title: {record['title']}, Released: {record['released']}")

运行结果:

  • 创建了电影 The Matrix 和 John Wick 的节点。
  • 创建了演员 Keanu Reeves 的节点。
  • 创建了 Keanu Reeves 演过 The Matrix 和 John Wick 的关系。
  • 查询并返回 Keanu Reeves 演过的电影及其上映年份。

总结

通过本文的介绍,我们详细了解了如何使用 Py2neo 进行各种复杂的图数据库操作,包括索引与约束、事务处理、批量操作、图算法、与 Pandas 的集成,以及 NodeMatcher 和 RelationshipMatcher 的使用。这些功能可以帮助我们更高效地管理和分析图形数据,从而在实际应用中发挥图数据库的强大优势。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值