Neo4j Graph Academy, Упражнение 4, часть 5: Подобные запросы дают разные результаты, почему? - PullRequest
0 голосов
/ 11 февраля 2019

В Академии графов у нас есть упражнение 4, часть 5 с этим вопросом: 2.Получить фильмы и их актеров, где один из актеров также направил фильм, возвращая имена актеров, имя режиссера и название фильма.

Я попробовал это:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person)
WHERE exists((d)-[:ACTED_IN]->(m))
RETURN p.name, d.name, m.title

результат выглядел нормально, за исключением дублирующейся информации. Мой результат

После моего результата я увидел ожидаемый запрос из академии графов, и в нем произошли небольшие изменения, изменив DIRECTED на ACTED: IN и изменив существование с помощью DIRECTED, например:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(d:Person)
WHERE exists((d)-[:DIRECTED]->(m))
RETURN p.name, d.name, m.title

с таким результатом: Правильный результат

Мы видим, что нет никакой дублирующейся информации, такой как актер "Том Хэнкс", режиссер "Том Хэнкс".

Мой вопрос: почему Neo4j ведет себя так с таким небольшим изменением?

1 Ответ

0 голосов
/ 11 февраля 2019

Это связано с определенным поведением уникальности при обходе для одного совпадения с шаблоном.

Cypher использует уникальность, называемую RELATIONSHIP_PATH, что означает, что для каждого пути отношение должно быть уникальным - оно может быть толькообходится один раз за путь.

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

В первом запросе совпадение:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person)

В этом случае один и тот же узел p может иметь: ACTED_INи: НАПРАВЛЕННОЕ отношение к тому же m узлу фильма.Оба эти отношения будут пересекаться по одному разу, без проблем, поэтому p и d могут быть одним и тем же узлом, поэтому вы увидите, что для имен p и d появляется то же имя, что и в результатах.

Во втором запросе совпадение:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(d:Person)

На графике фильмов для актера, сыгравшего роль в фильме, будет только один:Отношение ACTED_IN между этой парой узлов, никогда не более 1.

Из-за этого d невозможно быть тем же узлом, что и p.Отношение: ACTED_IN будет проходить один раз от узла человека к узлу фильма, и его нельзя будет повторно использовать для обратного перехода от узла фильма к узлу человека.

Обратите внимание, что это ограничение действует только дляполностью МАТЧ или ФАКУЛЬТАТИВНЫЙ МАТЧ.Если разбить этот единственный MATCH на несколько, например:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
MATCH (m)<-[:ACTED_IN]-(d:Person)
...

, то в результатах вы увидите записи, где p - это тот же узел, что и d.Поскольку здесь есть два шаблона MATCH, нет никаких ограничений на отношения, проходящие между шаблонами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...