Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算节点关系数的快速方法_Java_Neo4j - Fatal编程技术网

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

Java 计算节点关系数的快速方法,java,neo4j,Java,Neo4j,我试图计算节点具有的特定类型的传出关系的数量。我的代码当前如下所示: int count = 0; for (Relationship r : node.getRelationships(RelationshipTypes.MODIFIES, Direction.OUTGOING)) { count++; } return count; getRelationships的返回类型是Iterable,因此不能使用size()或等效值。我试图避免将所有关系都从数据库中取出,因为有些节点有很多

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

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

getRelationships的返回类型是Iterable,因此不能使用size()或等效值。我试图避免将所有关系都从数据库中取出,因为有些节点有很多关系(>500万)。有没有更快的方法来实现这一点?

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

如果
节点.getRelationships(RelationshipTypes.MODIFIES,Direction.OUTGOING)
返回一种类型的
集合
,则 要了解节点具有的特定类型的传出关系的数量,只需使用以下命令:

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

我看到您正在使用neo4japi。另一种方法是使用gremlin查询语言,该语言可用于groovy和scala,但它们在内部也会做同样的事情。据我所知,由于性能原因,neo4j通过迭代器为您提供访问权限。例如,您可能有数百万个关系,但您希望在动态中通过结果分页。如果Neo4J总是返回一组关系,那就太慢了。这就是为什么他会返回一个迭代器,让您可以动态访问这些关系。在您需要它们之前,不会从数据库中检索它们


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

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


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

随着你想要检查的关系数量的增加,这种方法会快速增长。它是如何快速增长的?这是由于数据结构的大小调整,还是获取结构的大小会带来很高的成本?我的意思是,对于每个需求,您都需要一个数据结构。这是必然的事实,要解决这个特定问题,只为出站连接实现一个结构就足够了。假设他会为每个节点的每种类型的关系实现这种结构是不安全的。我们正在提供一个单一问题的解决方案。这不起作用,因为getRelationships返回的是Iterable,而不是集合。我担心答案是这样的,但希望我错了。同样,我不喜欢它,但是我已经通过了Neo4j存储对象的结构,并且磁盘上没有存储任何统计信息,一个节点的所有关系都在磁盘上的链表中。