2013-08-21 73 views
1

随着py2neo:批量创建多个关键索引节点:值对

batch = neo4j.WriteBatch(graph_db) 
for n in nodes: 
    batch.create_indexed_node_or_fail(index, key, value, {node properties}) 
batch.submit() 

你可以很容易地在批量创建索引节点。

但是,如何在批处理中创建节点并同时添加多个键:值对?或者将节点添加到多个索引?我想到的

一个想法是先创建节点,然后将它们第二批添加到索引:

​​3210

但这似乎复杂。 Py2neo太棒了,必须有更简单的方法。


基于薛明​​的回答,我想以此为节点列表:

batch = neo4j.WriteBatch(graph_db) 
item_in_batch = 0 

for n in list_of_nodes: 
    batch.create(n) # this works, all nodes are created 
    batch.add_indexed_node("people", "key", "value from n", item_in_batch) 
    batch.add_indexed_node("people", "key2", "other value from n", item_in_batch) 
    i += 1 
batch.submit() 

一些节点在我的指数结束了,但不是全部。当我搜索('key:value-from-n')索引时,它会返回一个节点,但不是正确的。当我尝试将索引添加到索引时,如何访问节点的“内部”ID?


我试过(目前正在测试)版本py2neo的1.6.0和它的作品!

n = batch.create(node) 

现在返回可在该批次中被用来指节点的请求对象。

一个例子是在docs for 1.6.0

回答

2

你不应该需要两批。您应该可以创建并添加同一批次。喜欢的东西:

batch = neo4j.WriteBatch(graph_db) 
batch.create({"name": "Alice}) 
batch.add_indexed_node("people", "name", "Alice", 0) 
batch.add_indexed_node("employees", "id", 2345678, 0) 
batch.add_indexed_node("fighter_pilots", "call_sign", "Silver Eagle", 0) 
batch.submit() 

对于唯一索引,那么您可以使用add_indexed_node_or_fail代替。

感谢您的赞扬:-)

+0

感谢Nigel!我会尝试的。我有点不明白为什么我可以用'0'来引用最后一个节点。它会在neo4j中有另一个ID,对吧?如果batch.create()和batch.add_indexed_node()在一个循环中并在创建几百个节点后提交,这也可以工作吗?我想我需要看看你的代码,试着更好地理解这个:) –

+0

零并不是指由服务器创建的节点ID,它指的是该批中的第零个项目,在这种情况下是新的创建节点。 –

+0

这适用于单节点,但如果我在批次中创建更多节点,则不适用。我认为它不会在迭代时引用批处理中的正确项目。我编辑我的问题与代码,任何帮助将不胜感激;) –