【问题标题】:Finding longest branch of a tree in Neo4j在 Neo4j 中找到最长的树枝
【发布时间】:2017-12-15 07:13:38
【问题描述】:

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

出于性能和持久性的原因,我想使用 Neo4j Java API 将此实现迁移到 Neo4j。在阅读文档时,我找不到一个方便的解决方案来查询 Neo4j 数据库中最长的分支。在我的实现中,我可以确保该图是一个 n 叉树。

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

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

【问题讨论】:

标签: algorithm neo4j tree neo4j-java-api


【解决方案1】:

没有用于搜索最长路径的内置功能。

找到它的一种方法是找到根节点和叶节点之间的所有路径,然后按长度 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.path.expand 过程查看APOC。性能会更好。

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

就像你说的,你可以保留一个指向这个节点的指针。搜索它会非常快,但是当在树上完成写入时,您必须维护此指针(对写入性能有影响)。

选择权在您,取决于您想要达到的读写性能。

干杯

【讨论】:

  • 感谢您的回答!找到所有路径并按长度排序是个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多