neo4j笛卡尔产品性能改进

时间:2014-11-05 14:01:08

标签: neo4j query-optimization cypher cartesian-product

我有一个拥有超过200万个节点的Graph数据库。我有一个应用程序,它采用社交图并对其进行一些推断。作为算法的一个步骤,我必须获得两个连接节点的关系[:friends]的所有可能组合。目前,我有一个查询,看起来像:     匹配(a) - [:朋友] - (c),(b) - [:朋友] - (d)其中id(a)= {ida}和id(b)= {idb}返回不同的c作为第一个, d作为第二个

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

示例 节点a有朋友:xy 节点b有朋友:ghi`` Then the result should be: x , g x , h X , I {Ý{1}}克, {Ý{1}} {ħ{1}} {Ý{1}} i`

2 个答案:

答案 0 :(得分: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标签创建节点。

普通节点有多少朋友?

答案 1 :(得分:0)

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

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

然后你没有交叉产品,你也可以很好地回报每个人的收集。