2017-02-21 3 views
0

Я работаю над выбором cypher запросов, которые присутствуют в пути, и поэтому мы предоставляем начальный узел и список узлов, которые ожидаются в пути и ожидаемом результате это узлы из предоставленного списка.Neo4j Cypher - предел для предложения «in» в запросе

Не могли бы вы предложить, каков предел в статье в Neo4j, как у нас предел 2100 в sql.

Пример запроса:

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

Я не уверен, что ограничения для коллекций, но я могу легко создать 100000 с 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); 

EDIT

Из вашего комментария, вам кажется хотите только вернуть ключи оборудования, где: Узел оборудования имеет путь к вашему узлу: person.

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-го уровня, и поэтому использование выше моего запроса будет: «С [1505697,2406945,2408297,2408531,2410815,2413566,2415224] as equipKeys MATCH (n: person {key: 2529962, ownBy: 0}) UNWIND equipKeys as equipKey MATCH (c: Оборудование {ключ: equipKey}) MATCH путь = (n) <- [: отношение * 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