Cypher & Neo4j : for loop with Cypher request



我有一个单词列表,我想在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)

最新更新