我正在使用Neo4j图Java API。我在Neo4J中构建了一个图形,如下图所示 -
我在图表上有Person
个节点和Article
节点。它们通过其他节点与多条路径连接。
我想遍历每个Person
和Article
节点之间的所有路径来计算Random Walk Probability。问题是图形很大,我想使用多线程方法。
以下是伪代码 -
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中,每个Transaction都是线程绑定的,所以我在不同的线程中运行getRandomWalkScore(..)
函数。虽然它在开始时工作并利用所有核心,但在大约10小时后它只使用1或2个核心。虽然我的图表的磁盘大小约为1GB,但需要大量的内存~60GB。除此之外,还需要很长时间才能完成。我有以下查询 -
任何建议或指针都将不胜感激。谢谢!
答案 0 :(得分:2)
由于您正在进行大规模的图形全局操作,因此您应该考虑编写多线程代码。
请注意,正在进行的项目主要关注此类工作负载并提供最常见的全局图算法,请参阅https://neo4j-contrib.github.io/neo4j-graph-algorithms/。 Pagerank在一天结束时你想要什么?如果您的算法丢失,请在那里打开github问题。