使用 Neo4j 进行接触者追踪 - 有些人未被识别
Contact Tracing Using Neo4j - Some people are not identified
我正在使用 Neo4j 开发接触者追踪框架。有2种类型的节点,即Person和Location。 Person 和 Location 之间存在 VISITED 关系,它具有属性 startTS 和 endTS。示例:
如果 人 1 被感染,我需要检索与他有直接或间接联系的所有其他 人节点图数据库。我遍历通向一个人节点的所有关系,并应用一个公式来确定 当前人 (人 2)是否出现在特定的位置位置与 前一个人(第 1 个人)同时。对识别出的所有人员节点重复此过程。在上图中,根据他们的 startTS 和 endTS,人 2 与人 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 识别为感染者。任何帮助都将不胜感激。谢谢
您遍历关系并将每个关系的时间戳与其前身进行比较。但是,您只想比较两个人 (Person)-[:VISITED]-(Location)-[:VISITED]-(Person)
之间的 VISITED
关系。但是在您的方法中,您也在比较两个位置之间的关系 (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
我正在使用 Neo4j 开发接触者追踪框架。有2种类型的节点,即Person和Location。 Person 和 Location 之间存在 VISITED 关系,它具有属性 startTS 和 endTS。示例:
如果 人 1 被感染,我需要检索与他有直接或间接联系的所有其他 人节点图数据库。我遍历通向一个人节点的所有关系,并应用一个公式来确定 当前人 (人 2)是否出现在特定的位置位置与 前一个人(第 1 个人)同时。对识别出的所有人员节点重复此过程。在上图中,根据他们的 startTS 和 endTS,人 2 与人 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 识别为感染者。任何帮助都将不胜感激。谢谢
您遍历关系并将每个关系的时间戳与其前身进行比较。但是,您只想比较两个人 (Person)-[:VISITED]-(Location)-[:VISITED]-(Person)
之间的 VISITED
关系。但是在您的方法中,您也在比较两个位置之间的关系 (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