具有可变长度的多个关系的过滤路径(您可能认识的人查询)

时间:2019-07-04 07:34:32

标签: neo4j cypher graph-databases

因此,假设我们有User个节点,Company个节点,Project个节点,School个节点和Event个节点。这些节点之间存在以下关系

  • (User)-[:WORKED_AT {start: timestamp, end:timestamp}]->(Company)
  • (User)-[:COLLABORATED_ON]->(Project)
  • (Company)-[:COLLABORATED_ON]->(Project)
  • (User)-[:IS_ATTENDING]->(Event)
  • (User)-[:STUDIED_AT]->(School)

我正在尝试将用户推荐给任何给定的用户。我的开始查询看起来像这样

MATCH p=(u:User {id: {leftId}})-[r:COLLABORATED_ON|:AUTHORED|:WORKED_AT|:IS_ATTENDING|:STUDIED_AT*1..3]-(pymk:User)
RETURN p
LIMIT 24

现在,这会将我带回1到3个关系中的所有pymk用户,这很好。但是我想根据关系属性过滤路径。如果userpymk的工作开始日期和结束日期不重叠,就像删除以下路径。

(User)-[:WORKED_AT]->(Company)<-[:WORKED_AT]-(User)

我可以通过单个查询来完成

MATCH (u:User)-[r1:WORKED_AT]->(Company)<-[r2:WORKED_AT]-(pymk:User)
WHERE 
    (r1.startedAt <  r2.endedAt) AND (r2.startedAt < r1.endedAt)
RETURN pymk

但是我无法在一系列路径中做到这一点。我什至不知道这是否可能。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

Theme that is extended

我们在这里使用APOC来获取集合的最大值和最小值(仅Cypher中的Extension ThemesMATCH p=(:User {id: {leftId}})-[:COLLABORATED_ON|:AUTHORED|:WORKED_AT|:IS_ATTENDING|:STUDIED_AT*1..3]-(:User) WITH p, [rel in relationships(p) WHERE type(rel) = 'WORKED_AT'] as worked WHERE size(worked) <> 2 OR apoc.coll.max([work in worked | work.startedAt]) < apoc.coll.min([work in worked | work.endedAt]) RETURN p LIMIT 24 聚合函数是跨行的聚合函数,不能在列表上使用)。

这取决于将重叠的逻辑提炼为max(),您可以在此highly popular answer here中查看