使用新的关系进行整个图遍历和更新节点,即通过neo4j

时间:2015-09-24 16:31:45

标签: graph neo4j cypher

就像下面的链接说http://www.neo4j.org/graphgist?8173017用于构建节点之间的相似关系一样,我写了一个查询来更新具有共同主要兴趣的节点。在我的情况下,我有60k节点,200k感兴趣的实体和关系之间的关系。

Match path=(p:Entity)-[:interestedIn]->(i:Interest)<-[:interestedIn]-(p1:Entity) return count(path) 

给我44404280。 计划是为所有实体创建一个新的相似性与价值(共同/总)关系作为p和p1之间的属性。

查询耗尽内存(分配了14 Gb堆空间)。那么我应该使用graphx和其他大数据图处理技术来实现这一目标吗?还是有什么可以做的优化?

1 个答案:

答案 0 :(得分:1)

你显然想要计算那些有共同兴趣的人。

您当前的查询(如果它运行完成)实际上返回正确数字的两倍,因为每个实体对将被计数两次(作为person1 / person2和person2 / person1)。不仅如此,你还在消耗双倍的内存。

天真的解决方案

以下查询通过对pp1的ID强加订单来消除重复对(以及任何自我配对)。它应该使用更少的内存,更好的性能,并且还能给你一个准确的结果。

MATCH (p:Entity)-[:interestedIn]->(i:Interest)<-[:interestedIn]-(p1:Entity)
WHERE ID(p)> ID(p1)
RETURN count(*)

然而,由于此解决方案仅将内存需求减半,因此可能仍会耗尽内存。

开明的解决方案

您可以在不查询对的情况下计算对数!

鉴于具有相同兴趣的N个实体,这些实体中可能存在(N * (N-1))/2个唯一对。

以下查询使用该公式来提供答案,而无需查询对。它只查询对每个兴趣感兴趣的所有实体,计算每个兴趣的对数,并总结这些总数。

MATCH (p:Entity)-[:interestedIn]->(i:Interest)
WITH i, (COUNT(p)*(COUNT(p)-1))/2 AS numPairs
RETURN SUM(numPairs);

这应该会大大降低内存和CPU的复杂性,从O(N ^ 2)到O(N)。