【问题标题】:Retrieving all edges of specific type starting from given node从给定节点开始检索特定类型的所有边
【发布时间】:2017-09-07 09:39:35
【问题描述】:
我遇到了图遍历的问题。使用典型的图遍历算法(DFS、BFS)无法解决我的用例。我想要遍历节点,从特定节点 (N) 开始,其中边缘的类型为 ET。我想用 &path 从 N 到节点检索所有节点。使用东方的一种策略可以做到这一点,但我希望拥有所有可能的路径——不仅仅是一个。
示例:
对于上图,从 R 到 C 有两条路径:
我的图表可以更复杂一些,但想法是一样的。
在 OrientDB 文档中,我发现 Graph 上有一个方法可以返回所有边 (getEdgesofClass(String class))。我认为我可以解决我的问题如果我能以某种方式指定我想要调用此方法的图(主图的子图 - 仅与根节点连接的节点)。
感谢大家的意见。
【问题讨论】:
标签:
orientdb
graph-traversal
【解决方案1】:
这个答案有点晚了……但是。
在 OrientDB 中,只有一个查询/机制,您正在尝试的事情是不可能的。原因是 OrientDB 不会访问一旦访问过的顶点。这是数据库的实用设计选择。但是,如果路径不止一条,那么就很难获得从一个顶点到另一个顶点的所有路径。
shortextDistance() 函数将找到两个顶点之间的最短距离。在您的情况下,它会给出 Root -> A -> C 或 Root -> B -> C,这绝对无法解决您的问题。
您最好的选择是 TRAVERSE。如果您从 Root 遍历 * 并选择 $path,您将获得以下路径(SELECT $PATH FROM(TRAVERSE * [rid or Root])),您将获得以下(或相反):
- 根-->A-->C
- 根-->B
你永远不会得到 Root-->B-->C(比如说)。原因是“C”顶点已被访问且不会再次访问。
最好的方法是遍历边缘和顶点并自己形成路径。
TRAVERSE out(),outE() FROM [rid or Root] 将为您提供所有顶点、Root、A、B 和所有边。使用 is,您可以使用诸如 JGraphT 之类的库形成图形,该库具有查找所有路径的功能(请参阅:AllDirectedPaths)。