如何使用py2neo v4和Neo4j合并节点和关系

问题描述 投票:1回答:1

我试图执行一个基本的合并操作,通过逐行浏览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")  

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

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

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

任何人都有关于使用py2neo合并节点的任何建议或指示?

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

python-3.x neo4j py2neo
1个回答
0
投票

我有一个类似的问题,刚刚完成了我的头发,弄清楚出了什么问题!所以!我学到的是至少在我的情况下......也许是你的,因为我们得到了类似的错误消息并且做了类似的事情。问题在于我,因为我试图创建一个Node,其中__primarykey__字段的字段名称与其他字段不同。

PSEUDO示例:

# 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"

我希望这会有所帮助,并且很明显我仍然会从围绕着事物的过程中恢复过来。如果不清楚,请告诉我,我会修改。

祝好运。

© www.soinside.com 2019 - 2024. All rights reserved.