如何优化递归查询 - Neo4j?

时间:2021-03-21 15:58:32

标签: neo4j cypher graph-databases

我正在使用 Neo4j 开发联系人跟踪框架。有两种类型的节点,即人员和位置。 Person 和 Location 之间存在一个 VISITED 关系,它具有属性 startTS 和 endTS。示例:

enter image description here

现在假设第 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 i % 2 = 0
  OR (rels[i].endTS >= rels[i-1].startTS AND rels[i].startTS <= rels[i-1].endTS)
)
RETURN otherPerson

问题在于,处理大型数据集需要花费太多时间。上面的查询可以优化吗?感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

不幸的是,对于这一点,我们在扩展期间过滤这些更复杂条件的语法存在一些限制。我们可以介绍扩展后过滤,但您需要一个上限,否则在更复杂的图形上效果不佳。

要获得您今天需要的内容(在扩展期间而不是之后进行过滤),您需要利用我们的遍历 API 在 Java 中实现一个自定义过程,然后在您的 Cypher 查询中调用该过程。

已经为 GQL 提出了可以涵盖这些情况的高级语法,我们绝对希望在 Cypher 中使用它。它在我们的积压工作中。