neo4j 使用Py2Neo更新带有合并的节点

xxls0lw8  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(337)

我正在尝试使用py2neo库合并并更新一个图表。

from py2neo import Graph, Node, Relationship

graph = Graph(host, auth=(user, password,))

tx = graph.begin()
alice = Node("Person", name="Alice")
bob = Node("Person", name="Bob")
KNOWS = Relationship(alice, "KNOWS", bob)
tx.create(KNOWS)
graph.commit(tx)

这将创建所需的节点和边

(:Person {name: "Alice"})-[:KNOWS]->(:Person {name: "Bob"})

但是,如果我尝试在新事务中修改alice,则不会得到任何更改
例如:

new_tx = graph.begin()
alice["age"] = 32
new_tx.merge(alice, "Person", "name")
graph.commit(new_tx)

我怀疑我误解了Transaction在这里的工作原理。我希望上面的操作等价于找到Alice并更新新属性或创建一个新节点。
更新:我已经发现了Graph.push方法,但仍然希望得到关于最佳实践的建议。

bjp0bcyl

bjp0bcyl1#

您需要定义一个主键,以便MERGE知道哪个属性可以用作主键。
用于Cypher MATCH和MERGE操作的主属性键。如果未定义,则使用特殊值“id”来将唯一性与内部节点ID而不是属性联系起来。请注意,这会改变GraphObject示例上的Graph.create()和Graph.merge()等操作的行为。
最好的做法可能是为每个节点类型定义一个自定义类,并在其中定义主键。

class Person(GraphObject):
    __primarykey__ = "name"

    name = Property()
    born = Property()

    acted_in = RelatedTo(Movie)
    directed = RelatedTo(Movie)
    produced = RelatedTo(Movie)

相关问题