Cypher: получение узлов с ТОЛЬКО входящими или ТОЛЬКО исходящими краями (начальные узлы / конечные узлы) - PullRequest
0 голосов
/ 30 марта 2020

Я ищу правильный шифровый запрос, чтобы получить первый и последний узлы путей при выборе узла, который находится между ними. Идея состоит в том, чтобы сжать большой график воздействия, чтобы отображались только источники (только исходящие ребра = зеленые узлы) и конечные последствия (только входящие ребра = красные узлы), а также выбранный узел.

Здесь является иллюстративным примером графика:

Example Graph

Теперь при выборе, например, node d, я хотел бы получить node d и first node и last node каждого пути, в котором node d является частью, а также соответствующих (новых) отношений, так что на выходе получается следующий график:

enter image description here

Следовательно, Iam ищет вид свертывания, в котором исключаются начальный и конечный узлы.

Из-за этого ответа Я уже знаю, что возможно создавать виртуальные графы с apoc.create.vRelationship.

Но Iam борется с идентификацией зеленого start nodes и красного end nodes, как описано выше, а также с созданием желаемого выхода.

Я ищу запрос, где только узел между ними (например, node d) является параметром, а результат всегда такой же, как на втором изображении.

Я ценю любую помощь или вдохновение a спасибо большое заранее

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Этот запрос вернул бы node d (фильтруя здесь по свойству name в качестве примера) и все связанные граничные узлы:

MATCH (d {name: "d"})-[:RELATED_TO*]-(n)
WHERE NOT ((n)-[:RELATED_TO]->() AND (n)<-[:RELATED_TO]-())
RETURN d, n

Условием для граничных узлов будет то, что они надевают не имеет :RELATED_TO отношений в обоих направлениях.

0 голосов
/ 30 марта 2020

Для вашей иллюстрированной модели данных (при условии, что требуемый узел middle не является ни узлом start, ни end):

MATCH (start)-[:RELATED_TO*]->(middle)-[:RELATED_TO*]->(end)
WHERE
  middle.id = 123 AND
  NOT EXISTS(()-[:RELATED_TO]->(start)) AND
  NOT EXISTS((end)-[:RELATED_TO]->())
RETURN start, middle, end,
  apoc.create.vRelationship(start, 'RELATED_TO', {}, middle) as pre_rel,
  apoc.create.vRelationship(middle, 'RELATED_TO', {}, end) as post_rel

[ОБНОВЛЕНИЕ]

Приведенный выше запрос Можно, к сожалению, создавать дублирующие виртуальные отношения. Это не:

MATCH (middle)
WHERE middle.id = 123
MATCH (start)-[:RELATED_TO*]->(middle)
WHERE NOT EXISTS(()-[:RELATED_TO]->(start))
WITH middle, COLLECT(start) AS starts, COLLECT(apoc.create.vRelationship(start, 'RELATED_TO', {}, middle)) AS vr1s
MATCH (middle)-[:RELATED_TO*]->(end)
WHERE NOT EXISTS((end)-[:RELATED_TO]->())
RETURN middle, starts, COLLECT(end) AS ends, vr1s, COLLECT(apoc.create.vRelationship(middle, 'RELATED_TO', {}, end)) AS vr2s

ПРИМЕЧАНИЕ. Вам также необходимо снять флажок «Соединить узлы результата» в настройках браузера (нажмите на значок «шестеренка» на левой панели браузера), или еще что-то «реальное». "отношения также будут отображаться.

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