微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Cypher Query - 收集连接到第三类节点的两种不同类型的节点

如何解决Cypher Query - 收集连接到第三类节点的两种不同类型的节点

首先,这是我想要的,然后我会解释我的尝试。

在这个简化的示例中,我有一个包含节点 ABCD 的图。我只有 A->BB->CB->D 之类的关系。我想将到节点 A 的每个连接聚合到一个列表中,然后将每个到节点 B 的连接聚合到两个单独的列表中:一个用于 B->C 连接,另一个用于 B->D 连接。类似于下面的内容

{
 'A': 'A','Bs': [{
   'B': 'B','Cs': [
     ...
   ]
   'Ds': [
     ...
   ]
 },...]
}

现在是我的特定用例。我有连接到航点的旅行节点。航点连接到机场和我所说的 POI。我想返回带有航点列表的旅行,其中每个航点都有两个列表:机场列表和 POI 列表。我未能成功完成此操作,也未找到任何具有此确切用例的示例。除了下面的查询之外,我还尝试了许多其他的 foreach 循环和其他结构的变体。我想这是我最接近的一次。在下面的查询中,B->C 相当于 HAS_AIRPORTS 关系,B->D 相当于 HAS_POI 关系。我认为我的问题归结为需要在同一级别进行多个聚合。我得到了一些奇怪的输出,由于 2 个聚合,事情似乎在重复。对不起,如果这不清楚,我是密码查询语言术语的新手。谢谢,我很感激任何帮助。

            MATCH (t:Trip {uid: $tripId})
            WITH t
            OPTIONAL MATCH (t)-[:HAS_WAYPOINTS]-(w {active: true})
            WITH t,w
            OPTIONAL MATCH (w)-[wa:HAS_AIRPORT]-(a:NeoAirport)
            WITH t,w,collect(a{.*,active:wa.active}) as airports
            WITH t,w {.*,airports:airports } as waypoints
            OPTIONAL MATCH (w)-[wp:HAS_POI {active: true}]-(p:PointOfInterest)
            WITH t,waypoints,collect({source:wp.source,uid:p.uid,placeId:p.placeId}) as pois
            WITH t,apoc.map.setKey( waypoints,'pointsOfInterest',pois )
            WITH t,t {.*,waypoints: collect(waypoints) } as trips
            OPTIONAL MATCH (t)-[tsa:HAS_START_AIRPORTS]-(sa)
            WITH t,collect(sa) as sa,trips
            WITH t,apoc.map.setKey( trips,'startAirports',sa ) as trips
            OPTIONAL MATCH (t)-[tea:HAS_START_AIRPORTS]-(ea)
            WITH t,collect(ea) as ea,'endAirports',ea ) as trips
            RETURN trips

解决方法

有帮助的一件事是聚合并不是将匹配模式的结果放入列表的唯一方法。您可以改用 pattern comprehensions,这样可以简化您的查询。

另外,我将假设有一个 :HAS_END_AIRPORTS 关系到旅行的终点机场,我们应该使用它来获得终点机场。

MATCH (t:Trip {uid: $tripId})
OPTIONAL MATCH (t)-[:HAS_WAYPOINTS]-(w {active: true})
WITH t,w,[(w)-[wa:HAS_AIRPORT]-(a:NeoAirport) | a {.*,active:wa.active}] as airports,[(w)-[wp:HAS_POI {active: true}]-(p:PointOfInterest) | p {source:wp.source,.uid,.placeId}] as pointsOfInterest
WITH t,collect(w {.*,airports,pointsOfInterest}) as waypoints
WITH t,waypoints,[(t)-[:HAS_START_AIRPORTS]-(sa) | sa] as startAirports,[(t)-[:HAS_END_AIRPORTS]-(ea) | ea] as endAirports
RETURN t {.*,startAirports,endAirports} as trips

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。