2017-02-21 254 views
0

我正致力于获取路径中存在的节点的密码查询,因此我们提供了路径中预期的开始节点和节点列表以及预期结果是提供的列表中的节点。Neo4j Cypher - 查询中“in”子句的限制

您能否提出建议Neo4j中从句的限制是什么,就像我们在sql中限制2100一样。

例子查询:

MATCH (n:person{key:2529962, ownBy:0}) 
MATCH path = n<-[:relation]-(c:Equipment) 
WHERE c.key in [1505697,2406945,2408297,2408531,2410815,2413566,2415224,] 
RETURN distinct EXTRACT (p in NODES(path)| p.key); 

感谢 那伏乃尔

回答

2

我不知道是什么的限制是收藏,但我可以很容易地创建100,000 return range (1,100000) as largeCollection

然而,一个更好的方式来获得这些节点是集合放松入行,然后用这些密钥匹配的节点上:

// better to parameterize this, when you get the chance 
WITH [1505697,2406945,2408297,2408531,2410815,2413566,2415224] as equipKeys 
MATCH (n:person{key:2529962, ownBy:0}) 
UNWIND equipKeys as equipKey 
MATCH (c:Equipment{key:equipKey}) 
MATCH path = (n)<-[:relation]-(c) 
RETURN distinct EXTRACT (p in NODES(path)| p.key); 

编辑

从您的评论,看来你只想返回设备密钥,其中:设备节点具有指向您的个人节点的路径。

您正在使用的MATCH将查找所有可能的路径,这些路径会在大中型图表上窒息,特别是在许多关系中。

您可能想要使用EXISTS()函数,如果存在这样的路径,它将返回true或false。也就是说,你可能想考虑通过给出可能的上限来限制路径。

WITH [1505697,2406945,2408297,2408531,2410815,2413566,2415224] as equipKeys 
MATCH (n:person{key:2529962, ownBy:0}) 
UNWIND equipKeys as equipKey 
MATCH (c:Equipment{key:equipKey}) 
WITH DISTINCT n, c 
WHERE EXISTS((n)<-[:relation*0..10]-(c)) 
RETURN c.key 
+0

感谢它帮助。 – Navneet

+0

在我的使用情况下,我希望结果作为键存在于第n层的路径中,所以使用上面我的查询将是: “WITH [1505697,2406945,2408297,2408531,2410815,2413566,2415224] as装备键 MATCH(n:人{key:2529962,ownBy:0}) UNWIND equipKe as equipKey MATCH(c:Equipment {key:equipKey}) MATCH path =(n)< - [:relation * 0 .. ] - (c) RETURN distinct c.key“ 但是,如果节点具有大量关系,则此查询花费时间。你能否建议任何更好的方法来实现相同的目标。 谢谢 – Navneet

0

你可以很容易测试:

UNWIND RANGE(0,6) as p 
WITH toInt(10^p) as maxx 
WITH maxx, RANGE(1,maxx) as testArray 
RETURN maxx, size(testArray), maxx IN testArray, (maxx+1) IN testArray