就像下面的链接说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和其他大数据图处理技术来实现这一目标吗?还是有什么可以做的优化?
答案 0 :(得分:1)
你显然想要计算那些有共同兴趣的人。
您当前的查询(如果它运行完成)实际上返回正确数字的两倍,因为每个实体对将被计数两次(作为person1 / person2和person2 / person1)。不仅如此,你还在消耗双倍的内存。
以下查询通过对p
和p1
的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)。