具有复杂标准的最短路径,是否可以在任何图形DBMS

时间:2017-05-18 05:02:57

标签: neo4j orientdb arangodb

现在我正在使用Neo4j并从错误的一方解决了任务。 首先,我得到allShortestPaths,然后使用java在其中搜索正确的。 当然,这种方式即使存在也不能保证结果。 所以,我正在寻找可以原生搜索我需要的任何图形DBMS。

Datamodel很简单:

  • 节点:除识别号码外没有其他属性

  • 关系:1个属性

为清楚起见 - 它是彼此拥有的组织和股份列表(即财产=百分比> 0 <= 100)。

通过路径时的

标准是:

  • 如果下一个关系是50 ++,则包含节点(路径继续)
  • 如果下一个关系较小,则为50,但路径中的所有节点都已拥有 50+这个节点,然后路径仍然继续

这意味着算法不仅要计算路径本身的关系,还要计算“边”关系(最好不要总是这样,但只有当“下一个关系”为50时)。

最后,但并非最不重要:它应该具有原生最短路径的性能(即18毫升节点上的几毫秒+ 40毫升关系)或接近。不是几小时甚至几分钟。现在,shortestpath可以在几毫秒内找到30-40-50跳的路径,这太棒了。使用关系值,我可以在几秒钟内获得几个长度的最短路径。但这不是理想的解决方案。

我不是Neo4j专家(还是:),从我到目前为止发现的内容来看 - allsSortestPaths的表现相当厚实。添加额外条件可能会将性能从毫秒降低到数小时。这是不可接受的:(路径长度10 ++也是必须的。

我想,我想要太多,但仍然欢迎任何提示,想法和解决方案!

1 个答案:

答案 0 :(得分:0)

对于小型数据集,我只相信Cypher在某些WHERE条件下处理它(最简单的解决方案,效率最低)

下一个最佳解决方案(如果可以的话)是“预编译”解决方案。如果您能够以一种方式构建问题,即少数分类帐节点或关系可以存储您需要的信息,并且更新这些分类帐比完全重新编译解决方案更容易,这将是存储和检索信息的最佳方式(因为在阅读时,你只需要拉出一个节点或关系)。

但也许你不可能简化解决方案,而你只需 来进行复杂的遍历。 Cypher很擅长这个,但它对数据库中的内容是盲目的,不能利用你会知道的事实。在这种情况下(为了获得最佳性能),您需要使用Traversal API(Neo4J还有Java Core API,但Traversal API更容易,只能忽略不计)