Neo4j入门(三)删除关系

共 1909字,需浏览 4分钟

 ·

2021-08-22 16:10

        本文将介绍笔者在工作中使用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这条关系,正是我们想要的结果。

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


浏览 122
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报