【问题标题】:Cypher hangs, how do we fix/redesign?Cypher 挂起,我们如何修复/重新设计?
【发布时间】:2013-09-12 14:06:12
【问题描述】:

设节点m、n、p和关系r1、r2如下:

(n)-r1->(p)<-r2-(m)

我们需要从 m、n、p、r1 和 r2 返回属性,所以我们有一个具有以下 START、MATCH 和 WHERE 子句的密码:

START START n=node:...
MATCH (n)-[r1:RELTYPE]->(p)<-[r2:RELTYPE]-(m)
WHERE r1.SOMEPROPERTY = r2.SOMEPROPERTY
RETURN ...

SOMEPROPERTY 始终存在于 r1 和 r2 上。通常,n 与 p 有 50,000 个关系,每个 p 可以与 m 有一百万个关系。我们只能从 n 开始。

密码挂了!!通过java程序和neoclipse。如果我们将关系的数量从 50,000 和 100 万减少到几百个,那么密码就可以工作。

关于如何使这种密码算法高效并适用于大量关系的任何建议?也可以重新设计图表。

【问题讨论】:

    标签: java performance neo4j cypher


    【解决方案1】:

    所以你有 |r1| = 50,000 和 |r2| = 1,000,000。如果要将每个 r1 与每个 r2 进行比较,则有 50,000 * 1,000,000 = 50,000,000,000。您需要进行 500 亿次比较。如果每次比较需要 1 毫秒,那么执行此比较仍需要 50,000,000(五千万)秒。这是 578 天。

    我可以看到您降低这种复杂性的唯一可能方法是,如果您要在以 SOMEPROPERTY 为键的节点 p 上创建 r1 和 r2 映射。那么您只需要获取 SOMEPROPERTY 的 r1 列表和 SOMEPROPERTY 的 r2 列表。

    【讨论】:

    • 保留映射并对其进行更新,任何改变都是一种解决方案。我们能做得更好吗?通过 SOMEPROPERTY 输入关系索引会有所帮助吗?
    • 就时间复杂度而言,我认为您不会找到比一对地图更好的解决方案。问题的根源在于如何减少比较次数。使用地图,您只需检索两个列表。添加关系时,您在 P 节点上进行一次计算,剩下 M + N 个计算。这是您将要达到的最小计算集。
    猜你喜欢
    • 2019-09-30
    • 2011-12-05
    • 2014-10-23
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    相关资源
    最近更新 更多