【问题标题】:neo4j cartesian product performance improvementneo4j 笛卡尔积性能提升
【发布时间】:2014-11-05 14:01:07
【问题描述】:

我有一个包含超过 200 万个节点的图形数据库。我有一个应用程序,它需要一个社交图并对其进行一些推断。作为算法的一个步骤,我必须得到两个连接节点的关系 [:friends] 的所有可能组合。目前,我有一个查询,如下所示: match (a)-[:friend]-(c), (b)-[:friend]-(d) 其中 id(a)={ida} 和 id(b)={idb} 首先返回不同的 c, d 为第二个

所以,我已经知道节点ab,并且我想从ab 的朋友那里获得所有可能的配对。 这显然是一个非常缓慢的操作。我想知道是否有更有效的方法可以在 neo4j 中获得相同的结果。也许添加索引可能会有所帮助?欢迎任何想法/线索!

示例 节点a 有朋友:x, y 节点b有朋友:ghi`` Then the result should be: x,g x,h,h x x,i,g,y@89 y,h y,i`

【问题讨论】:

    标签: neo4j query-optimization cypher cartesian-product


    【解决方案1】:

    如果您还没有使用标签,则应该使用标签来加快查询速度,如下所示:

    MATCH (p1:Person)-[:FRIEND]->(p3:Person),(p2:Person)-[:FRIEND]->(p4:Person)
    WHERE ID(p1) = 6 AND ID(p2) = 7
    RETURN p3 as first, p4 as second
    

    显然,这将依赖于您创建带有:Person 标签的节点。

    平均节点有多少朋友?

    【讨论】:

    • 感谢您的回复。你能否解释一下为什么这会有所帮助?我不知道平均朋友数量,但差异很大。从极少数(少于 10 个)到数百甚至数千个不等。
    【解决方案2】:

    我不会使用两种模式,而只使用一种模式和IN 运算符。

    MATCH (p:Person)-[:FRIEND]->(friend:Person) 
    WHERE id(p) IN [1,2,3]
    RETURN p, collect(friend) as friends
    

    那么你就没有交叉积,你也可以很好地返回朋友作为一个人的收藏。

    【讨论】:

      猜你喜欢
      • 2019-05-10
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多