Cypher 和 Neo4j:带有 Cypher 请求的 for 循环

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

我不知道我错在哪里。

[附录]

我想seed_label为“crise sanitaire”添加 = 0,seed_label为“face crise”添加 = 1 等。我想seed_label为 list_of_labels 列表中的每个字符串添加属性。但该列表每天都会更新,这就是为什么我尝试将其自动化。


GCT1015
浏览 106回答 1
1回答

翻阅古今

首先,您的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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python