Neo4j入门(三)删除关系

2021-12-27 00:00:00 删除 节点 调用 关系 这条

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


我们试图删除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节点
  如果我们将图谱变为这样:


那么运行上述代码也能成功,但是图谱中仅剩下了Cook和Dan节点以及这两个节点的关系,却少了Alice、Bob节点和两条关系,这无疑是可怕的结果!
  那么原因是什么呢?参考官方文档:https://py2neo.org/2021.1/workflow.html#graph-objects中给出的说明,如下:


也就是说,我们在调用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这条关系,正是我们想要的结果。


  本文较为简单,仅用于记录工作中出现的问题。

来源:

https://mp.weixin.qq.com/s?src=11×tamp=1640591254&ver=3521&signature=cwgohZDlz5oP8L3VMxVteqXBYqrCrTE9KoiiE9YaZ0Alfi9ImkpWs6of7zEK6R6bBGZ3AqMNPSUH4QfUSVt3puBku34fFVer4tb-uYl-5ZzB5SKPKH6yuzyFhqcH4eO*&new=1

相关文章