使用开始/结束日期筛选Neo4j中的关系

使用开始/结束日期筛选Neo4j中的关系,neo4j,cypher,Neo4j,Cypher,我有一个图形模型- (p:Person)-[r:LINK {startDate: timestamp, endDate: timestamp}]->(c:Company) 一个人可以同时链接到多个公司,一个公司可以同时有多个人链接到该公司(即,公司和人之间存在多对多关系) endDate属性是可选的,仅当人员离开公司时才显示 我正在尝试显示一个连接网络,并且可以使用以下密码查询成功返回一个人的所有相关节点(这将显示两个级别的人连接)- MATCH(p:Person{id:})-[r:LI

我有一个图形模型-

(p:Person)-[r:LINK {startDate: timestamp, endDate: timestamp}]->(c:Company)
一个人可以同时链接到多个公司,一个公司可以同时有多个人链接到该公司(即,公司和人之间存在多对多关系)

endDate属性是可选的,仅当人员离开公司时才显示

我正在尝试显示一个连接网络,并且可以使用以下密码查询成功返回一个人的所有相关节点(这将显示两个级别的人连接)-

MATCH(p:Person{id:})-[r:LINK*0..4]-(l)返回*
我现在需要做的是筛选关系在时间范围上匹配的关系,例如,2000年1月1日至2002年12月31日期间在A公司工作的人员1。第2人于2001年1月1日至2001年6月31日在A公司工作。人员3在2005年1月1日至1月1日期间在A公司工作,目前仍在A公司工作。人员1的结果应包括人员2,但不包括人员3

同样的逻辑需要应用于图形的所有级别(我们允许用户显示3个级别的连接),并与每个级别中的父节点相关,即在显示级别2时,应使用人员2和人员3的日期来过滤其各自的关系

从本质上说,我们正在尝试做一些类似于LinkedIn的连接,但同时根据在公司工作的人员进行过滤


我尝试过使用REDUCE函数,但无法使逻辑适用于可选的结束日期-是否有人可以建议如何根据开始日期和结束日期筛选关系?

类似的操作应该可以:

MATCH path=(p:Person {id: $id})-[r:LINK*..4]-(l)
WHERE ALL(x IN NODES(path)[1..] WHERE x.startDate <= p.endDate AND x.endDate >= p.startDate)
RETURN path;
匹配路径=(p:Person{id:$id})-[r:LINK*.4]-(l)
其中所有(x在节点(路径)[1..]中,其中x.startDate=p.startDate)
返回路径;
假设:

  • 主要利益相关者的
    id
    值由
    $id
    提供
  • 您希望模式的下限为1(这是默认值)。如果你用0作为下限,那么你也会得到主要的感兴趣的人——这可能不是你想要的
  • startDate
    endDate
    的值适合使用

事实证明,日期范围有4种方式可以重叠,但只有2种方式不重叠(第1人在第2人开始之前结束,或第2人在第1人开始之前结束),因此检查这两种无重叠条件是否存在要简单得多

在级别1的情况下,此查询应执行以下操作:

MATCH (start:Person{id:1})-[r1:LINK]->(c)<-[r2:LINK]-(suggest)
WHERE NOT ((r1.endDate IS NOT NULL and r1.endDate < r2.startDate) 
        OR (r2.endDate IS NOT NULL and r2.endDate < r1.startDate))
RETURN suggest

MATCH(start:Person{id:1})-[r1:LINK]->(c)(c1)(c2)显示您的尝试和样本数据以进行验证。请注意解释一下,当您在同一公司中搜索时间重叠的人员时,多个级别意味着什么。在linkedIn上,Person1与Person2相关,Person2与Person3相关,所以如果你在看其他公司,它可能会告诉你Person3是一个二级连接。你想要达到的目标是不清楚的,没有例子。谢谢@InverseFalcon,这正是我想要的。
MATCH (start:Person{id:1})-[r1:LINK]->(c)<-[r2:LINK]-(suggest)
WHERE NOT ((r1.endDate IS NOT NULL and r1.endDate < r2.startDate) 
        OR (r2.endDate IS NOT NULL and r2.endDate < r1.startDate))
RETURN suggest
MATCH path = (start:Person{id:1})-[:LINK*..6]-(suggest:Person)
WITH path, start, suggest, apoc.coll.pairsMin(relationships(path)) as pairs
WITH path, start, suggest, [index in range(0, size(pairs)-1) WHERE index % 2 = 0 | pairs[index]] as pairs
WHERE none(pair in pairs WHERE (pair[0].endDate IS NOT NULL AND pair[0].endDate < pair[1].startDate) 
                          OR (pair[1].endDate IS NOT NULL AND pair[1].endDate < pair[0].startDate))
RETURN suggest