【问题标题】:Neo4j 'Flatten/collapse' relationship across nodesNeo4j 跨节点的“展平/折叠”关系
【发布时间】:2018-11-10 03:49:19
【问题描述】:

我有一个如下图,灰色节点是事件。黄色节点是组件。组件依赖于事件,组件可以产生其他事件。不幸的是,节点标签没有清楚地显示出来,所以我添加了数字

我希望能够编写一个仅返回事件(灰色圆圈)但维护事件之间的关系或实际依赖关系的查询。

最终结果应该是另一个如下图:

这应该适用于任意大尺寸的图形,屏幕右侧可能有更多节点

用户 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);

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    你有这样的想法吗?

    创建模型

    为了方便可能的进一步答案和解决方案,我记下了我的图表创建声明:

    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;
    

    结果

    【讨论】:

    • 我有点困惑,左列是节点,右列是关系?
    • 我已经更新了答案。在左列中,您可以找到正在检查的事件,在右列中是触发事件和相关事件之间的路径。该路径包含两个事件节点以及您请求的它们之间的关系。
    • 这感觉像是一个中间步骤。我没有寻找一条路径,我期望另一个图作为我在 OP 中描述的关系的输出
    • 在我看来,路径是子图。它包含事件节点和请求的关系。为了更好地理解您的要求并改进答案,您能否提供一个虚构的结果表,我可以定位到什么?
    • @LukeDeFeo 如果您在原始问题中注明im expecting another graph,那就太好了。你说write a query which returns only the events (grey circles) but maintains the relationships or the actual dependencies between the events. 大多数人阅读query 并直观地认为输出将是一个列表。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多