我已经开始使用 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 版本是“Unix 2.0.3 社区版”,py2neo 版本是 1.6.4。