快速计算节点关系数的方法

时间:2013-03-21 17:57:42

标签: java neo4j

我正在尝试计算节点所具有的特定类型的传出关系的数量。我的代码目前看起来像这样:

int count = 0;
for (Relationship r : node.getRelationships(RelationshipTypes.MODIFIES, Direction.OUTGOING))
{
   count++;
}
return count;

getRelationships的返回类型是Iterable,所以我不能使用size()或等价物。我试图避免必须从数据库中拉出每个关系,因为一些节点有很多关系(> 500万)。有没有更快的方法呢?

4 个答案:

答案 0 :(得分:3)

没有。 neo4j在节点的磁盘上存储关系的方式是在链表中,并且它们不保留节点或关系的任何类型的统计信息。为了获得计数,您将必须遍历该类型的节点的所有关系。

即使你有一个缓存,他们可以更有效地存储它,系统可能仍然无法提供完整的图片。你的方法是最好的方法。

答案 1 :(得分:0)

我会尝试将传出存储在数据结构中并获取结构的大小。初始化对象时可能需要更长的时间,但这似乎是快速获取大小的最简单方法。

答案 2 :(得分:0)

如果node.getRelationships(RelationshipTypes.MODIFIES, Direction.OUTGOING)正在返回Collection类型 要知道节点具有的特定类型的传出关系的数量,您可以简单地使用以下内容:

int count = node.getRelationships(RelationshipTypes.MODIFIES, Direction.OUTGOING).size();

答案 3 :(得分:0)

我看到你正在使用neo4j api。另一种方法是使用ThinkerPop gremlin查询语言,它既可用于groovy,也可用于scala,但它们会在内部执行相同的操作。据我所知,neo4j因为性能原因让你通过迭代器访问。例如,您可以拥有数百万个关系,但您希望动态地对结果进行分页。如果Neo4J总是会返回一系列关系,那将会非常缓慢。这就是为什么他返回一个迭代器并让你即时访问关系。在您需要它们之前,不会从数据库中检索它们。

所以我会说不。我希望我能帮到你。