cypher - пропущен один из возможных путей - PullRequest
1 голос
/ 19 июня 2019

Я новичок с шифровальным выражением.И у меня есть эта база данных

CREATE
  (a:City {name: 'A'}),
  (b:City {name: 'B'}),
  (c:City {name: 'C'}),
  (d:City {name: 'D'}),
  (e:City {name: 'E'}),
  (a)-[:HAS_RAIL_ROAD_TO {distance : 5 }]->(b),
  (b)-[:HAS_RAIL_ROAD_TO {distance : 4 }]->(c),
  (c)-[:HAS_RAIL_ROAD_TO {distance : 8 }]->(d),
  (d)-[:HAS_RAIL_ROAD_TO {distance : 8 }]->(c),
  (d)-[:HAS_RAIL_ROAD_TO {distance : 6 }]->(e),
  (a)-[:HAS_RAIL_ROAD_TO {distance : 5 }]->(d),
  (c)-[:HAS_RAIL_ROAD_TO {distance : 2 }]->(e),
  (e)-[:HAS_RAIL_ROAD_TO {distance : 3 }]->(b),
  (a)-[:HAS_RAIL_ROAD_TO {distance : 7 }]->(e)

Когда я выполняю

  MATCH(:City { name: 'A' })-[r:HAS_RAIL_ROAD_TO*4]->(:City { name: 'C' })
  return count(r)

Я ожидал 3 как результат:

(A, B, C,D, C); (A, D, C, D, C); (A, D, E, B, C).

Но полученный результат равен 2

Я думаю, что во втором случае (A, D, C, D, C) он не возвращается к D.

Что вы думаетепричина этого?

1 Ответ

2 голосов
/ 19 июня 2019

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

(A, D, C, D, C) не будет работать, потому чтоесть только два отношения между D и C, и часть D, C, D пересекает их обоих, не оставляя других доступных отношений для повторного перехода назад от D к C.

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

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

Вы можете использовать процедуры расширения пути из Процедуры APOC , чтобы изменить уникальность и расширить, но ПОЖАЛУЙСТА, обязательно установите верхнюю границу (черезmaxLevel свойство config) в противном случае вы рискуете пройти бесконечный цикл, который, вероятно,EAP.

MATCH (start:City { name: 'A' }), (end:City { name: 'C' })
CALL apoc.path.expandConfig(start, {endNodes:[end], minLevel:4, maxLevel:4, relationshipFilter:'HAS_RAIL_ROAD_TO>', uniqueness:'NONE'}) YIELD path
RETURN [node in nodes(path) | node.name] as path
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...