2

我正在尝试计算节点具有的特定类型的传出关系的数量。我的代码目前如下所示:

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

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

4

4 回答 4

3

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

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

于 2013-03-21T19:07:42.527 回答
0

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

于 2013-03-21T18:00:26.737 回答
0

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

int count = node.getRelationships(RelationshipTypes.MODIFIES, Direction.OUTGOING).size();
于 2013-03-21T18:17:07.053 回答
0

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

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

于 2013-03-21T18:51:53.493 回答