在py2neo中批处理

时间:2014-05-22 16:37:47

标签: neo4j py2neo

我已经开始使用Node4j,我正在探索一些批处理,但遗憾的是,我在创建节点之间的关系时遇到了一些问题。

我的问题如下。我有一个从文件中读取的网站和用户列表。我可能在该文件中重复了网站和用户,因此我不想为这些重复的条目插入新节点。但由于文件很大,我想批量处理节点和关系。

基本上,我有两个函数来创建节点和关系,并将它们添加到批处理中。

graph_db = neo4j.GraphDatabaseService("http://localhost:7474/db/data/")
batch = neo4j.WriteBatch(graph_db)

def create_node(pvalue, svalue, type):
    return batch.create({\
        "pkey"  : pvalue,
        "skey"  : svalue,
        "type"  : type
        }
    )


def create_rel(from_node, type_label, to_node, fields):
    properties =\
    {"ACCT_KEY":  fields.ACCT_KEY}

    relation = rel(from_node, type_label, to_node, **properties)
    batch.create(relation)

然后,在使用字典确保我之前没有创建节点之后,我这样做:

node1 = create_node("ATTRIBUTE_1", "ATTRIBUTE_2", "WEBSITE")
node2 = create_node("ATTRIBUTE_3", "ATTRIBUTE_4", "USER")

create_rel(node1, "VISITED_BY", node2, fields)

我将引用保存到" node1"和" node2"在字典中,所以当我想创建涉及网站或已经注册的用户的关系时,我不会再次创建节点,而是直接使用引用。我在循环内执行此操作并且工作正常,直到我决定在经过一定次数的迭代后执行此操作:

batch.submit()
batch.clear()

当我决定使用之前批次的那些引用时,我收到以下错误:

Traceback (most recent call last):
    File "main.py", line 102, in <module>
        create_rel(cardholder, fraud_label, merchant,fields)
    File "main.py", line 33, in create_rel
        batch.create(relation)
    File "/usr/local/lib/python2.7/dist-packages/py2neo/neo4j.py", line 2775, in create
        "to": self._uri_for(entity.end_node)
    File "/usr/local/lib/python2.7/dist-packages/py2neo/neo4j.py", line 2613, in _uri_for
        uri = "{{{0}}}".format(self.find(resource))
    File "/usr/local/lib/python2.7/dist-packages/py2neo/neo4j.py", line 2604, in find
        raise ValueError("Request not found")
ValueError: Request not found

我相信这是因为它以某种方式丢失了之前批次的引用而且它们不再有效。我试图从节点收集ID并使用它们,但我找不到如何做到这一点。任何帮助将不胜感激,谢谢。

我的Node4j版本是&#34; 2.0.3社区版,适用于Unix&#34;和py2neo版本1.6.4。

1 个答案:

答案 0 :(得分:3)

如果文档中不清楚这一点,则表示道歉,但引用不能扩展到单独的批次或批量提交。引用先前创建的项目的正确方法是解析第一次提交的结果,并将所需的实体传递给第二次提交。

我通常建议每次提交使用一个批次,并避免重复使用同一批次对象。未来版本的py2neo可能会阻止这种情况。

相关问题