Вы имеете в виду что-то подобное?
Создание вашей модели
Для простоты возможных дальнейших ответов и решений отмечу мое утверждение создания графа:
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);
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;
Результат