Java 如何使用只读操作优化遍历Neo4j图?
我使用的是Neo4j图形。我用Neo4J构建了一个图,如下所示- 我在图上有Java 如何使用只读操作优化遍历Neo4j图?,java,multithreading,graph,neo4j,bigdata,Java,Multithreading,Graph,Neo4j,Bigdata,我使用的是Neo4j图形。我用Neo4J构建了一个图,如下所示- 我在图上有Person节点和Article节点。它们通过其他节点与多条路径连接 我想遍历每个人和文章节点之间的所有路径进行计算。问题是图形太大了,我想使用多线程方法 下面是伪代码- function processGraph() { For each personId in personIdList For each articleId in articelIdList randomWalkSco
Person
节点和Article
节点。它们通过其他节点与多条路径连接
我想遍历每个人
和文章
节点之间的所有路径进行计算。问题是图形太大了,我想使用多线程方法
下面是伪代码-
function processGraph()
{
For each personId in personIdList
For each articleId in articelIdList
randomWalkScore = getRandomWalkScore(personId, articleId)
storeRandomWalkScore(personId, articleId, randomWalkScore)
}
function getRandomWalkScore(personId, articleId)
{
randomWalkScore = 0
beginTransaction()
{
personNode = findPersonNode(personId)
articleNode = findArticleNode(articleId)
paths = findAllPathsBetween(personNode, articleNode)
For each path in Paths
randomWalkScore += getRandomWalkScore(path) // This will iterate over each relationship in path and multiply their weights
} //End Transaction
return randomWalkScore
}
简而言之,这是一个图遍历,由只读操作组成
在Neo4J中,每个都是线程绑定的,所以我在单独的线程中运行getRandomWalkScore(..)
函数。虽然它在启动时工作并使用所有内核,但在大约10小时后,它只使用1或2个内核。虽然我的图形的磁盘大小约为1GB,但它需要大量内存~60GB。除此之外,它需要很长时间才能完成。我有以下疑问-
如有任何建议或指示,将不胜感激。谢谢 > P>既然你做了大量的图形全局操作,你应该考虑编写你的代码多线程。
请注意,有一个正在进行的项目专注于这种工作负载,并提供最常见的全局图算法,请参阅。一天结束时,pagerank是你想要的吗?如果那里缺少您的算法,请在那里打开github问题。我需要的算法与PageRank略有不同。它基本上是计算两个节点之间的随机游走概率。对于这些路径查找操作为什么占用这么多内存以及如何减少内存,您有什么建议吗?我怀疑
findAllPathsBetween
将返回大量的可能性。