【问题标题】:How to optimise recursive query - Neo4j?如何优化递归查询 - Neo4j?
【发布时间】:2021-06-18 09:57:26
【问题描述】:

我正在使用 Neo4j 开发一个联系人跟踪框架。有2种类型的节点,即Person和Location。 Person 和 Location 之间存在 VISITED 关系,该关系具有属性 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 i % 2 = 0
  OR (rels[i].endTS >= rels[i-1].startTS AND rels[i].startTS <= rels[i-1].endTS)
)
RETURN otherPerson

问题在于该过程花费了太多时间来完成大型数据集。上面的查询可以优化吗?感谢您的帮助。

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    不幸的是,对于这个问题,我们在扩展过程中过滤这些更复杂的条件的语法存在一些限制。我们可以涵盖扩展后过滤,但您需要一个上限,否则这在更复杂的图上表现不佳。

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

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

    【讨论】:

    • 感谢您的建议。但是,我使用的是 .net,但找不到它的遍历 api。它仅限于java吗?
    • 是的。您需要将程序编译成 jar 并将其作为插件安装在 Neo4j 服务器上以供使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多