2017-02-21 251 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