我目前在Java中有一个仅附加树数据结构。此树的主要目的是维护指向最长分支的指针。 我通过引用最长分支中的最后一个节点来实现这一点,该节点在树中插入新节点时更新。
出于性能和持久性的原因,我想使用Neo4j Java API将此实现移至Neo4j。在完成文档的过程中,我无法找到一个方便的解决方案来查询最长分支的Neo4j数据库。在我的实现中,我可以确保图形是一个n-ary树。
在Neo4j中找到这种树中最长的分支的首选解决方案是什么?
答案 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
完成)。
这个算法将比以前的解决方案具有更好的平均性能,但在最坏的情况下,复杂性是相同的。
就像你说的那样,你可以保留一个指向这个节点的指针。搜索它的速度非常快,但是当你在树上完成写操作时必须保持这个指针(对写入性能有影响)。
选择权属于你自己,取决于你想要读写的表现。
干杯