Neo4j 'Свести / свернуть' отношения между узлами - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть график, который выглядит следующим образом, серые узлы - это события. Желтые узлы являются компонентами. Компоненты зависят от событий, и компоненты могут создавать другие события. К сожалению, метки узлов не дают четкого изображения, поэтому я добавил цифры

enter image description here

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

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

enter image description here

Это должно работать для графа произвольно большого размера, может быть больше узлов справа от экрана

Пользователь ThirstForKnowledge любезно создал шифр для импорта графика. Вставить сюда для наглядности

CREATE
  (c1:Component {name: 'Comp 1'})-[:PRODUCES]->(e3:Event {name: 'Event 3'}),
  (c1)-[:PRODUCES]->(e4:Event {name: 'Event 4'}),
  (c1)-[:DEPENDS_ON]->(e2:Event {name: 'Event 2'}),
  (c1)-[:DEPENDS_ON]->(e1:Event {name: 'Event 1'}),
  (c2:Component {name: 'Comp 2'})-[:DEPENDS_ON]->(e3),
  (c3:Component {name: 'Comp 3'})-[:DEPENDS_ON]->(e3),
  (c3)-[:DEPENDS_ON]->(e4),
  (e5:Event {name: 'Event 5'})<-[:PRODUCES]-(c2);

1 Ответ

0 голосов
/ 08 ноября 2018

Вы имеете в виду что-то подобное?

Создание вашей модели

Для простоты возможных дальнейших ответов и решений отмечу мое утверждение создания графа:

CREATE
  (c1:Component {name: 'Comp 1'})-[:PRODUCES]->(e3:Event {name: 'Event 3'}),
  (c1)-[:PRODUCES]->(e4:Event {name: 'Event 4'}),
  (c1)-[:DEPENDS_ON]->(e2:Event {name: 'Event 2'}),
  (c1)-[:DEPENDS_ON]->(e1:Event {name: 'Event 1'}),
  (c2:Component {name: 'Comp 2'})-[:DEPENDS_ON]->(e3),
  (c3:Component {name: 'Comp 3'})-[:DEPENDS_ON]->(e3),
  (c3)-[:DEPENDS_ON]->(e4),
  (e5:Event {name: 'Event 5'})<-[:PRODUCES]-(c2);

graph

Cypher оператор

MATCH
  path = (event1:Event)<-[:PRODUCES]-(:Component)-[:DEPENDS_ON]->(event2:Event)
RETURN
  event1.name AS eventUnderInspection, path;

Результат

╒══════════════════════╤═════════════════════════════════════════════════════════════════════════════════╕
│"eventUnderInspection"│"path"                                                                           │
╞══════════════════════╪═════════════════════════════════════════════════════════════════════════════════╡
│"Event 4"             │[{"name":"Event 4"},{},{"name":"Comp 1"},{"name":"Comp 1"},{},{"name":"Event 1"}]│
├──────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│"Event 4"             │[{"name":"Event 4"},{},{"name":"Comp 1"},{"name":"Comp 1"},{},{"name":"Event 2"}]│
├──────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│"Event 3"             │[{"name":"Event 3"},{},{"name":"Comp 1"},{"name":"Comp 1"},{},{"name":"Event 1"}]│
├──────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│"Event 3"             │[{"name":"Event 3"},{},{"name":"Comp 1"},{"name":"Comp 1"},{},{"name":"Event 2"}]│
├──────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│"Event 5"             │[{"name":"Event 5"},{},{"name":"Comp 2"},{"name":"Comp 2"},{},{"name":"Event 3"}]│
└──────────────────────┴─────────────────────────────────────────────────────────────────────────────────┘

Обновление для соответствия новым требованиям

Решение

Следующий запрос Cypher обогатит ваш существующий граф прямыми (сплющенными) отношениями между зависимыми событиями.

MATCH
  (sourceEvent:Event)<-[:DEPENDS_ON]-(:Component)-[:PRODUCES]->(targetEvent:Event)
MERGE (sourceEvent)<-[:FLATTENED_DEPENDS_ON]-(targetEvent);

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

MATCH
  path = (:Event)<-[:FLATTENED_DEPENDS_ON]-(:Event)
RETURN
  path;

Результат

graph2

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