Это связано с определенным поведением уникальности при обходе для одного совпадения с шаблоном.
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, нет никаких ограничений на отношения, проходящие между шаблонами.