【问题标题】:Cypher restrictions on queries chained after a load csv加载 csv 后链接的查询的密码限制
【发布时间】:2026-02-04 13:30:02
【问题描述】:

我目前正在使用 .net 中的螺栓驱动器在我的图表中导入一些关系。我想在这种情况下尝试load csv 命令(源在 csv 中)并比较性能,但查询仅应用于第一行。我用skip n limit 1 进行了测试,并且只设法让它逐行运行。

因此我想知道在加载 csv 循环中是否对“复杂”查询有任何限制?

这里是查询:

using periodic commit
LOAD CSV  FROM "file:///path/to/my/file.csv" AS row fieldterminator ';' 
with row
MATCH (n:Source {id:row[0]})
MATCH p=(o:Target {num:row[1]})-[:Version*..]->() 
WHERE row[2] in labels(o)
  WITH n, p ORDER BY LENGTH(p) DESC LIMIT 1    
  WITH n, last(nodes(p)) as m
MERGE (n)-[r:Rel]->(m);

谢谢!

编辑:

我的 csv 只是遵循此模式的常规 3 列 CSV:

IDTEXT0000000001;V150;LabelOne
IDTEXT0000000002;M245;LabelOne
IDTEXT0000000003;D666;Labeltwo
etc.

逐行我的意思是我在with row 之后首先用limit 50 进行测试,因为它不起作用(没有添加)然后我做了limit 1skip 1 limit 1、`skip 2 limit 2 等. “逐行”方法有效,但您会承认这并不是您真正想做的。

最终代码:

using periodic commit
LOAD CSV  FROM "file:///path/to/my/file.csv" AS row fieldterminator ';' 
with row
MATCH (n:Source {id:row[0]})
MATCH p=(o:Target {num:row[1]})-[:Version*..]->() 
WHERE row[2] in labels(o)
WITH n, p ORDER BY LENGTH(p) DESC    
WITH n, last(nodes(collect(p)[0])) as m
MERGE (n)-[r:Rel]->(m);

还有 apoc(稍微快一点):

using periodic commit
LOAD CSV  FROM "file:///path/to/my/file.csv" AS row fieldterminator ';' 
with row
MATCH (n:Source {id:row[0]})
call apoc.cypher.run('MATCH p=(o:Article {num:$num})-[:VersionChristopher*0..]->() WHERE $label in labels(o) WITH p ORDER BY LENGTH(p) DESC LIMIT 1 return last(nodes(p)) as m', {num:row[1], label:row[2]})
yield value
with n, value.m as m
MERGE (n)-[r:Rel]->(m);

但是使用 Bolt 可以让我在没有标签测试的情况下构建查询,并且仍然比使用加载 csv 快 3 到 4 倍。感谢您的帮助:)

【问题讨论】:

  • 您能分享您的 CSV 文件并显示其中的几行吗?
  • 另外,“应用于第一行”和“逐行运行”这两个短语是什么意思?你的意思是MERGE 总是在创建一个新的关系?

标签: csv neo4j cypher load-csv


【解决方案1】:

问题在于您在查询中使用了 LIMIT:

WITH n, p ORDER BY LENGTH(p) DESC LIMIT 1    

这不限制每行,LIMIT 适用于所有行。如果每个 n(来自您的 CSV)和多个 p 路径有多行,则应用此限制后,您只有一行、一个 n、一个 p,然后是一个 MERGE 操作。

你应该阅读how to limit results per row,一旦你确定你的查询应该没问题。

【讨论】:

  • 好的,很好,我会改变这部分。我用它来取最长路径的最后一个节点。这是有道理的,它在一个一个地用螺栓触发查询时工作正常,但在 csv 导入中却没有。确认后我会在明天标记为答案。
最近更新 更多