使用 Neo4j 进行联系人跟踪 - 有些人未被识别

问题描述

我正在使用 Neo4j 开发联系人跟踪框架。有两种类型的节点,即PersonLocation。 Person 和 Location 之间存在 VISITED 关系,该关系具有 startTSendTS 属性。示例:

enter image description here

如果Person 1 被感染,我需要使用图形数据库检索与他有直接或间接接触的所有其他Person Nodes。我遍历通向人物节点的所有关系,并应用一个公式来确定当前人物(人物 2)是否同时出现在特定位置以前的人(人 1)。对标识的所有人员节点重复此过程。在上图中,第 2 个人根据他们的 startTS 和 endTS 与第 1 个人联系。这是我的代码

MATCH path =(infected:Person {id:'1'})-[*]-(otherPerson:Person)
WITH RELATIONSHIPS(path) as rels,otherPerson
WHERE all(i in range(1,size(rels)-1)  WHERE (rels[i].endTS >= rels[i-1].startTS AND rels[i].startTS<= rels[i-1].endTS))
RETURN otherPerson

在下面的场景中,第 1 个人感染第 2 个人,第 2 个人感染第 3 个人。但是,即使第 3 个人与第 2 个人有明显接触,代码也不会将第 3 个人识别为感染者。任何帮助都会很大赞赏。谢谢。

enter image description here

解决方法

您遍历关系并将每个关系的时间戳与其前任进行比较。但是,您只想比较两个人 VISITED 之间的 (Person)-[:VISITED]-(Location)-[:VISITED]-(Person) 关系。但在您的方法中,您还比较了两个位置 (Location)-[:VISITED]-(Person)-[:VISITED]-(Location) 之间的关系。一个人不可能同时出现在两个地点。

因此,您只想比较每隔一对关系。由于您使用的是索引,因此您可以轻松使用模运算符,以便两个位置(或一个人)之间的关系对始终为真:

MATCH path = (infected:Person {id:'1'})-[*]-(otherPerson:Person)
WITH relationships(path) as rels,otherPerson
WHERE all(i in range(1,size(rels)-1)
  WHERE i % 2 = 0
  OR (rels[i].endTS >= rels[i-1].startTS AND rels[i].startTS <= rels[i-1].endTS)
)
RETURN otherPerson