Neo4j Cypher - 查询中“in”子句的限制

时间:2017-02-21 12:27:38

标签: neo4j cypher

我正在处理一个cypher查询,获取路径中存在的节点,因此我们提供了路径中预期的起始节点和节点列表,预期结果是来自提供列表的节点。

你能否说一下Neo4j中in子句的限制是什么,就像我们在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);

由于 NAVNEET

2 个答案:

答案 0 :(得分:2)

我不确定收藏的限制是什么,但我可以使用return range (1,100000) as largeCollection轻松创建100,000个。

但是,获取这些节点的更好方法是将集合展开为行,然后在节点上使用这些键进行匹配:

// 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

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