在Neo4j找到一棵树的最长的分支

时间:2017-07-11 09:43:27

标签: algorithm neo4j tree neo4j-java-api

我目前在Java中有一个仅附加树数据结构。此树的主要目的是维护指向最长分支的指针。 我通过引用最长分支中的最后一个节点来实现这一点,该节点在树中插入新节点时更新。

出于性能和持久性的原因,我想使用Neo4j Java API将此实现移至Neo4j。在完成文档的过程中,我无法找到一个方便的解决方案来查询最长分支的Neo4j数据库。在我的实现中,我可以确保图形是一个n-ary树。

在Neo4j中找到这种树中最长的分支的首选解决方案是什么?

  • 像我在Java实现中那样保留指向最后节点的指针?
  • 模拟算法以找到最长路径并使用遍历API或通过密码查询实现此目的?
  • 我还没有找到Neo4j中的一些内置功能?

1 个答案:

答案 0 :(得分:1)

没有用于搜索最长路径的内置功能。<​​/ p>

找到它的一种方法是找到根节点和叶节点之间的所有路径,然后按长度desc对它们进行排序。并采取第一个。

cypher中,应该使用类似于:

的内容
MATCH (root:Root)-[:HAS_CHILD*]->(n:Node)
WHERE size((n)-[:HAS_CHILD]->())=0
RETURN n
ORDER BY size(RELS(p)) DESC
LIMIT 1

更好的方法是使用遍历计算一个操作中的所有路径。您可以使用APOC程序查看apoc.path.expand。表演会更好。

最后的解决方案是使用自定义遍历创建自己的算法,如果已经找到最长的遍历,则修剪分支。 (可以使用自定义Evaluator完成)。 这个算法将比以前的解决方案具有更好的平均性能,但在最坏的情况下,复杂性是相同的。

就像你说的那样,你可以保留一个指向这个节点的指针。搜索它的速度非常快,但是当你在树上完成写操作时必须保持这个指针(对写入性能有影响)。

选择权属于你自己,取决于你想要读写的表现。

干杯