【问题标题】:Can't delete neo4j nodes with a relationship using py2neo无法使用 py2neo 删除具有关系的 neo4j 节点
【发布时间】:2015-04-27 19:33:27
【问题描述】:

我正在通过 py2neo 模块学习 neo4j。修改example,我很困惑为什么我在这里遇到错误。如果我想删除 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.

【问题讨论】:

  • 您需要先删除关系。在 Neo4j 中就是这样,并且可以防止孤儿关系
  • @ChristopheWillemsen 谢谢,知道这很有用!如果您可以将其作为一个工作示例(删除对之间的所有已知关系),我将能够接受它作为答案。

标签: python neo4j py2neo


【解决方案1】:

根据文档,这应该是一个简单的 CYPER 查询:

当你想删除一个节点和任何去往或来自它的关系时,使用 DETACH DELETE。

MATCH (n:Person)
DETACH DELETE n

http://neo4j.com/docs/stable/query-delete.html#delete-delete-a-node-with-all-its-relationships

【讨论】:

    【解决方案2】:

    删除节点之前需要先删除关系。

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

    您可以通过发出 Cypher 查询来做到这一点:

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

    或者(但不是 100% 确定你可以在不知道 rel 类型和结束节点的情况下)使用 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)
    

    【讨论】:

    • 我不想同时学习两个概念,但我应该同时学习 Cypher 语法和 neo4j 吗?
    • 是的! Cypher 是 Neo4j 的图形查询语言
    • +1 学习 Cypher。 Py2neo 有很多高级功能可以帮助您入门,但它们不能替代学习 Cypher。事实上,如果没有它,你不应该期望能深入了解 Neo4j。
    【解决方案3】:

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

    见手册:http://py2neo.org/v3/database.html#the-graph

    您可以在整个子图(包括节点)上运行删除方法。

    它对我很有效。

    【讨论】:

    • 不幸的是,在提供的最小文档中没有任何指定子图或使用该方法的示例,即使它对您很有效,它对大多数新用户也没有用。要算作答案,您应该为 OP 的用例提供这样的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多