Neo4j入门(三)删除关系

  本文将介绍笔者在工作中使用Neo4j时遇到的一个坑。
  下面笔者将会介绍这个问题。简单来说,就是当我们使用py2neo操作Neo4j时,delete方法会删除整个子图,而仅仅是删除子图中的关系是调用separate方法。以下举例来说明。
  假设我们有如下图谱:
示例图谱1
我们试图删除Alice -Knows-> Bob这条关系。 我们使用py2neo调用delete来删除该关系,示例代码如下:

from py2neo import Graph, Node, Relationship
from py2neo import NodeMatcher, RelationshipMatcher

# 连接Neo4j
url = "http://localhost:7474"
username = "neo4j"
password = "12345678"
graph = Graph(url, auth=(username, password))
print("neo4j info: {}".format(str(graph)))

start_node = NodeMatcher(graph).match("Person", name="Alice").first()
end_node = NodeMatcher(graph).match("Person", name="Bob").first()
rel = RelationshipMatcher(graph).match([start_node, end_node], r_type="Knows").first()
print(rel)
graph.delete(rel)

输出结果如下:

neo4j info: Graph('http://neo4j@localhost:7474')
(Alice)-[:Knows {}]->(Bob)

可以发现,我们是删除了Alice -Knows-> Bob这条关系,但同时我们也删除了Alice和Bob节点
  如果我们将图谱变为这样:
示例图谱2
那么运行上述代码也能成功,但是图谱中仅剩下了Cook和Dan节点以及这两个节点的关系,却少了Alice、Bob节点和两条关系,这无疑是可怕的结果!
  那么原因是什么呢?参考官方文档:https://py2neo.org/2021.1/workflow.html#graph-objects中给出的说明,如下:
py2neo的delete方法说明
也就是说,我们在调用delete方法时,会删除这个子图,并且通过上述的例子,与这个子图的关联关系也会随之删除。而我们的需求是仅仅删除关系,那么应该调用separate方法,因此,修改代码如下:

from py2neo import Graph, Node, Relationship
from py2neo import NodeMatcher, RelationshipMatcher

# 连接Neo4j
url = "http://localhost:7474"
username = "neo4j"
password = "12345678"
graph = Graph(url, auth=(username, password))
print("neo4j info: {}".format(str(graph)))

start_node = NodeMatcher(graph).match("Person", name="Alice").first()
end_node = NodeMatcher(graph).match("Person", name="Bob").first()
rel = RelationshipMatcher(graph).match([start_node, end_node], r_type="Knows").first()
print(rel)
graph.separate(rel)

唯一的修改是将delete方法修改为separate方法,这样我们就只删除了Alice -Knows-> Bob这条关系,正是我们想要的结果。

  本文较为简单,仅用于记录工作中出现的问题。
  2021年8月18日于上海闵行,此日上海较为酷热~

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值