gpt4 book ai didi

java - 如何通过只读操作最优地遍历 Neo4j Graph?

转载 作者:行者123 更新时间:2023-11-30 02:21:44 25 4
gpt4 key购买 nike

我正在使用 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是线程绑定(bind)的,所以我在单独的线程中运行 getRandomWalkScore(..) 函数。虽然它在开始时可以工作并利用所有核心,但大约 10 小时后它只使用 1 或 2 个核心。尽管我的图表的磁盘大小约为 1GB,但它需要约 60GB 的大量内存。除此之外,还需要很长时间才能完成。我有以下疑问-

  1. 在 Neo4J 图上执行此操作的最佳方式是什么?
  2. 如何减少该程序的内存占用?
  3. 如何减少执行时间?

任何建议或指示将不胜感激。谢谢!

最佳答案

由于您进行了大量的图形全局操作,因此您应该考虑以多线程方式编写代码。

请注意,有一个正在进行的项目专注于此类工作负载并提供最常见的全局图算法,请参阅 https://neo4j-contrib.github.io/neo4j-graph-algorithms/ 。最终页面排名是您想要的吗?如果那里缺少您的算法,请在那里打开一个 github 问题。

关于java - 如何通过只读操作最优地遍历 Neo4j Graph?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46637739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com