为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

GCT1015 2023-06-27 14:40:30
我有一个单词列表,想在 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)


查看完整回答
反对 回复 2023-06-27
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信