我有一个单词列表,想在 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 列表中的每个字符串添加属性。但该列表每天都会更新,这就是为什么我尝试将其自动化。
1 回答
翻阅古今
TA贡献1780条经验 获得超5个赞
首先,您的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)
添加回答
举报
0/150
提交
取消