无法使用py2neo删除带有关系的neo4j节点

3
我正在通过py2neo模块学习neo4j。修改示例时,我对为什么会在此处出现错误感到困惑。如果我想删除所有Person类型的节点,为什么不能遍历图形并删除与我的条件匹配的节点?如果节点之间的关系被删除,代码就可以正常运行。
from py2neo import Node, Relationship, Graph

g = Graph("http://neo4j:test@localhost:7474/db/data/")
g.delete_all()

alice = Node("Person", name="Alice")
bob   = Node("Person", name="Bob")
g.create(Relationship(alice, "KNOWS", bob)) # Works if this is not present

for x in g.find("Person"):
    print x
    g.delete(x)

这会导致以下错误:
  File "start.py", line 12, in <module>
    g.delete(x)
  ...
py2neo.error.TransactionFailureException: Transaction was marked as successful, but unable to commit transaction so rolled back.

1
你需要首先删除关系。这在Neo4j中是必须的,以防止孤立的关系。 - Christophe Willemsen
@ChristopheWillemsen 谢谢,这个信息很有用!如果你能将其转化为一个可运行的示例(其中删除了所有已知对之间的关系),我将能够接受它作为答案。 - Hooked
3个回答

5

4

在删除节点之前,您需要先删除节点之间的关系。

这是Neo4j的标准行为,可以防止孤立的关系。

您可以通过发出Cypher查询来完成此操作:

graph.cypher.execute("MATCH (n:Person) OPTIONAL MATCH (n)-[r]-() DELETE r,n")

或者(但不确定是否可以在不知道关系类型和终节点的情况下)使用py2neo Store:
    store = Store(g)
    rels = store.load_related(alice)
    for r in rels
    g.delete(r)

    g.delete(alice)

store load_related 的普通脚本为:

store.load_related(alice, "LIKES", Person)

我试图不同时学习两个概念,但是我是否应该与Neo4j一起学习Cypher语法? - Hooked
2
是的,肯定!Cypher是Neo4j的图查询语言。 - Christophe Willemsen
3
学习Cypher有助于提高技能。Py2neo拥有许多高级功能可以帮助你入门,但这并不能代替学习Cypher。事实上,没有学习Cypher的话,你不应该指望能在Neo4j中走得太远。 - Nigel Small

0

我认为这个问题在py2neo 3版本中已经完全解决了。

请参考手册:http://py2neo.org/v3/database.html#the-graph

在那里,你可以对整个子图(包括节点)运行删除方法。

对我来说,它运行得很好。


很遗憾,没有提供任何关于指定子图或使用该方法的最小文档示例,即使它对您很有效,对于大多数新用户来说也是无用的。为了算作一个答案,您应该为问题提出者的使用情况提供这样一个示例。 - Aaron Bramson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接