我有一个单词列表,我想在Neo4j中用作种子标签。
这些标签每天都会更新,所以我想自动化我的Cypher请求。
这是我今天的清单:
列表:list_of_labels = ['crise sanitaire', 'face crise', 'confinement avril', 'crise coronavirus', 'virus guerre']
我在Cypher请求中使用了变量:
def create_seed_property(tx, i): j = 0 while j < len(list_of_labels): tx.run(" MATCH (n:ARTICLE {label: $i}) SET n.seed_label = $j RETURN n ") j +=1
接下来我做了这个:
for i in list_of_labels: session.read_transaction(create_seed_property(i))
我不知道我错在哪里了。
[增编]
我想为"crise sanitaire"添加seed_label
=0,为"face crise"等添加seed_label
=1。我想为list_of_labels列表中的每个字符串添加seed_label
属性。但是这个列表每天都在更新,这就是为什么我尝试自动化它
首先,您的run()
调用没有传递任何参数,因此这可能是直接的问题。此外,即使你的逻辑确实有效,你最终也会向每个ARTICLE的seed_label写5次,但最终的属性值总是4——这是浪费,不是你想要的。
此外,为了提高效率,您应该避免在循环中调用run()
(或者至少尽量减少在该循环中调用run()
的次数(。通常,您应该将要迭代的值作为列表参数传递给查询,并在查询中使用UNWIND来处理列表值。如果列表不太长,那么您可以将它们传递给run()
,而不需要循环。或者,如果列表太长,无法在单个事务中处理,则可以保持循环,但将大小合理的值的子列表传递给run()
。
对于您的特定用例,您应该能够通过一个run()
调用高效地完成所有工作:
tx.run("UNWIND RANGE(0, SIZE($ls)-1) AS i MATCH (n:ARTICLE {label: $ls[i]}) SET n.seed_label = i",
ls=list_of_labels)