2016-12-14 3 views
0

Мой Cypher запрос выглядит следующим образом:Cypher запрос с пути переменной длины

match (n1:N1)-[r1:R1]->()<-[r2:R2*0..]-(n3)<-[r3:R3]-(n4) return * 

Из-за 0 в отношениях с переменной длиной (<-[r2:R2*0..]-), я ожидал, что этот запрос будет таким же, как следующее (n2 добавлено):

match (n1:N1)-[r1:R1]->(n2)<-[r2:R2*0..]-(n3)<-[r3:R3]-(n4) return * 

но они возвращают совершенно разные результаты. Может кто-нибудь помочь мне понять, почему это так? Это не значит, что 0 не допускается? Спасибо.

ответ

0

Ваш второй запрос имеет переменную, отсутствующую в первом запросе, поэтому, конечно, ваши результаты будут разными, будет дополнительный столбец.

Если взять соответствующий фрагмент Вашего первого запроса:

(n1:N1)-[r1:R1]->()<-[r2:R2*0..]-(n3) 

Это означает, от несвязанного узла в шаблоне «()», мы будем пересекать 0 или больше отношения типа: R2 и результирующие узлы будут привязаны к переменной n3. Так что несвязанный узел всегда будет присутствовать в столбце n3, независимо от того, есть или нет: отношения R2 присутствуют, чтобы пройти.

Ваш второй запрос даст очень похожие результаты, каждый из столбцов должен совпадать с одними и теми же данными, за исключением того, что имеется дополнительный столбец n2, который всегда будет совпадать с ранее несвязанным узлом. Этот же узел все равно будет отображаться и в столбце n3.

Если это не решит проблему, вы можете лучше объяснить, что в результатах не имеет для вас смысла, и то, что, по вашему мнению, делает 0 в вашем запросе (0 определенно разрешено в переменной длине отношения).

+0

Я рассматриваю результаты как график (интерактивная визуализация в браузере), а не как таблица. В этом случае я ожидаю, что результат будет таким же. – Dennis

+0

Нет. 'R2 * 0..' означает отношение нулевой длины, т. Е. Никакого отношения. –

+0

@ ChristophMöbius Вы ошибаетесь здесь, '..' означает, что это отношение переменной длины. 0 - нижняя граница, и поскольку мы опускаем верхнюю границу, она по умолчанию равна бесконечности. Раздел в [путях с нулевой длиной] (https://neo4j.com/docs/developer-manual/current/cypher/clauses/match/#_zero_length_paths) в документации объясняет, что этот шаблон будет соответствовать самому исходному узлу, или любое число данного типа отношения (ноль больше отношения), чтобы соответствовать следующей части пути. – InverseFalcon

Смежные вопросы