你有这样的想法吗?
创建模型
为了方便可能的进一步答案和解决方案,我记下了我的图表创建声明:
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);
密码声明
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;
结果