2015-01-03 2 views
0

Я тестировал следующий запросРезультаты пути Neo4J между узлами, проходящими через n отношений [*], слишком велики и отсутствуют?

MATCH p=(me)-[*]-(rf) 
WHERE me.name = "Filipa" AND rf.name="Anders" 
RETURN p 

enter image description here

enter image description here

enter image description here

Глядя на график, в моем понимании, путь должен просто вернуть 2 прямые пути (оба с 2 прыжками) от Филипы до Андерса, вместо этого я получаю 2 дополнительных пути, проходящих от Андерса и возвращающихся к Андерсу с двумя дополнительными путями, идущими в o pposite направления после узла Андерса.

  • Почему эти два дополнительных пути проходят дважды в узле Андерса, включенных в результаты?
  • Ясно, что это связано с теорией графов, какова тема, которая касается этих аспектов графиков? Приветствуется краткое объяснение.

Из моего комментария: @Christophe Willemsen

Поскольку я не включал в себя направление отношения, 2 дорожки должна присутствовать, вместо этого я просто получить обратно один путь. Оба должны присутствовать:

(Filipa)->(Dilshad)->(Anders) //this path is present 
(Anders)->(Dilshad)->(Filipa) //This path is NOT present, why?? 

Кроме того, в «результаты» следующие пути включены:

(Filipa)->(Dilshad)->(Anders)->(Becky)->(Emil)->(Cesar)->(Anderes) //These 2 paths pass 2 times at Anders node. Why?? 
(Filipa)->(Dilshad)->(Anders)->(Cesar)->(Emil)->(Becky)->(Anderes) 

Последние 2 пути прохождения оба раза в узел Андерса, почему? Это не имеет никакого смысла, если это логика, мы могли бы иметь бесконечные пути?

ответ

2

Есть две точки с запросом:

  1. Вы соответствуете всему шаблону, с * длиной отношений, а это означает, что если он найти путь с 2 прыжками и один с 3-хмелем вы получите оба взамен.

  2. Вы не указали направление своих отношений, так что он автоматически найдет как минимум два пути, один в один и тот же, и по-другому.

Вы можете указать направление отношений со стрелкой:

MATCH p=(me)-[*]->(rf) 

Вы можете ограничить возврат суммы путей к 1:

MATCH p=(me)-[*]->(rf) 
WHERE me.name = "Filipa" AND rf.name="Anders" 
RETURN p 
LIMIT 1 

Вы можете получить кратчайший путь от меня к Андерсу с пунктом shortestPath:

MATCH p=shortestPath((me)-[*]->(rf)) 

который автоматически ограничивается одним результатом

+0

Поскольку я не включил направление отношений, должно присутствовать 2 пути, вместо этого я просто вернусь к одному пути.Оба должны присутствовать: (Filipa) -> (Дильшад) -> (Андерс) и (Андерс) -> (Дильшад) -> (Филипа). Кроме того, в результаты включены только один путь: (Filipa) -> (Дильшад) -> (Андерс) -> (Бекки) -> (Эмиль) -> (Цезарь) -> (Андеры) (Filipa) -> (Дильшад) -> (Андерс) -> (Цезарь) -> (Эмиль) -> (Бекки) -> (Anderes) Последние два пути проходят дважды до узла Андерса, почему? Это не имеет никакого смысла, если это логика, мы могли бы иметь бесконечные пути? – Luther