Cypher对加载csv后链接的查询的限制

时间:2017-07-31 15:58:54

标签: csv neo4j cypher load-csv

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

因此我想知道是否对#34;复杂"有任何限制。加载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.

逐行显示我的意思是我首先在limit 50之后使用with row进行测试,因为它不起作用(没有添加)我然后limit 1skip 1 limit 1 ,`跳过2限制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允许我在没有标签测试的情况下构建查询,并且仍然比使用load csv快3到4倍。感谢您的帮助:)

1 个答案:

答案 0 :(得分: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

相关问题