首页 > 解决方案 > 如何使用 py2neo v4 和 Neo4j 合并节点和关系

问题描述

我正在尝试执行基本的合并操作,通过逐行浏览 csv 文件将不存在的节点和关系添加到我的图表中。我正在使用 py2neo v4,因为基本上没有关于如何使用 py2neo 的文档或示例,我无法弄清楚如何实际完成它。这不是我的真实代码(处理许多不同的情况非常复杂),但它的结构基本上是这样的:

import py2neo as pn
graph = pn.Graph("bolt://localhost:###/", user="neo4j", password="py2neoSux")
matcher = pn.NodeMatcher(graph)
tx = graph.begin()

if (matcher.match("Prefecture", name="foo").first()) == None):
  previousNode = pn.Node("Type1", name="fo0", yc=1)
else:
  previousNode = matcher.match("Prefecture", name="foo").first())

thisNode = pn.Node("Type2", name="bar", yc=1)
tx.merge(previousNode)  
tx.merge(thisNode)  
theLink = pn.Relationship(thisNode, "PARTOF", previousNode)
tx.merge(theLink)
tx.commit() 

目前,这 ValueError: Primary label and primary key are required for MERGE operation 在第一次需要合并尚未找到的节点时(即创建节点时)会引发错误。那么我将这一行更改为:

tx.merge(thisNode,primary_label=list(thisNode.labels)[0], primary_key="name")  

这给了我IndexError: list index out of range来自 py2neo 源代码深处的错误(....site-packages\py2neo\internal\operations.py",第 168 行,在 merge_subgraph at 中node = nodes[i])。我试图弄清楚那里出了什么问题,但我无法nodes通过与其他命令的各种连接来破译列表的来源。

因此,它当前匹配并创建了几个节点没有问题,但在某些时候它会匹配直到它需要创建,然后尝试创建该节点失败(即使它使用相同的代码并在循环中的相同情况)。它通过了我样本中的所有 20 行一次,但通常停在第 3-5 行。

我认为这与交易有关(见评论),但是当我直接在图表上合并时,我遇到了同样的问题。也许它与 py2neo 合并函数为节点找到比节点更多的身份有关。也许我指定主要标签和/或键的方式有问题。因为这个错误和代码是不透明的,我不知道如何继续前进。

有人对将节点与 py2neo 合并有任何建议或说明吗?

当然,我想知道如何解决我当前的问题,但更一般地说,我想学习如何使用这个包。示例、说明、真实文档?

标签: python-3.xneo4jpy2neo

解决方案


我遇到了类似的问题,刚刚把头发扯下来找出问题所在!所以!我学到的是,至少在我的情况下......也许你也是,因为我们收到了类似的错误消息并且正在做类似的事情。问题在于我试图创建一个Node字段__primarykey__名称与其他字段名称不同的字段。

伪示例:

# in some for loop or complex code
node = Node("Example", name="Test",something="else")
node.__primarykey__ = "name"
<code merging or otherwise creating the node>

# later on in the loop you might have done something like this cause the field was null
node = Node("Example", something="new")
node.__primarykey__ = "something"

我希望这会有所帮助,而且很明显,我仍在从头​​疼的事情中恢复过来。如果不清楚,请告诉我,我会修改。

祝你好运。


推荐阅读