如何使用只读操作优化遍历Neo4j Graph?

时间:2017-10-09 01:37:23

标签: java multithreading graph neo4j bigdata

我正在使用Neo4j图Java API。我在Neo4J中构建了一个图形,如下图所示 -

enter image description here

我在图表上有Person个节点和Article节点。它们通过其他节点与多条路径连接。

我想遍历每个PersonArticle节点之间的所有路径来计算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。除此之外,还需要很长时间才能完成。我有以下查询 -

  1. 在Neo4J图上执行此操作的最佳方法是什么?
  2. 如何减少此程序的内存占用?
  3. 如何缩短执行时间?
  4. 任何建议或指针都将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

由于您正在进行大规模的图形全局操作,因此您应该考虑编写多线程代码。

请注意,正在进行的项目主要关注此类工作负载并提供最常见的全局图算法,请参阅https://neo4j-contrib.github.io/neo4j-graph-algorithms/。 Pagerank在一天结束时你想要什么?如果您的算法丢失,请在那里打开github问题。