因此,假设我们有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
用户,这很好。但是我想根据关系属性过滤路径。如果user
和pymk
的工作开始日期和结束日期不重叠,就像删除以下路径。
(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
但是我无法在一系列路径中做到这一点。我什至不知道这是否可能。
感谢您的帮助。
答案 0 :(得分:0)
这应该可以解决问题:
Theme that is extended
我们在这里使用APOC来获取集合的最大值和最小值(仅Cypher中的Extension Themes
和MATCH 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中查看