分层数据的 OrientDB 查询

OrientDB query for hierarchical data

OrientDB 服务器 v2.0.10 , 我正在尝试针对以下情况提出查询。

我有 2 个层次结构:A->B->C 和 D->E->F 层次结构中的节点数可以更改。 第一层级中的节点可以使用某种关系连接到其他层级,比如 'Assigned'。 我想要的是第二层级的父节点,如果从第一层到第二层级中的任何节点都有任何传入边。

例如,假设我们有 Car-Child->Engine-Child->Piston 和 Country-Child->State-Child->City 以及将 Car 或 Engine 或 Piston 与国家或州或城市相关联的关系 Made_In 因此,如果与 Country 或 State 或 City 有关系,则 Country 应该是 returned。例如,Engine1-Made_In->Berlin,这就是 return 德国。 对不起,这样一个玩具般的例子。我希望它是清楚的。

谢谢。

您应该考虑阅读有关 "traversing" 的章节 - 那应该是缺少的 link 来回答您的问题。您可以在这里找到它:http://orientdb.com/docs/last/SQL-Traverse.html

基本上,如果您将图表视为家谱,您想要实现 3 件事:

  • 从树 1 中查找给定家庭成员的所有 children、grand-children、grand-grand-children(等等)

  • 查找与另一家谱的成员有关系的人 (=ASSIGNED)

  • 告诉我谁在这棵树的顶端 (=Hierarchy2)

可能的解决方案之一应该看起来像这样:

既然你想在 hierarchy2 的顶部结束,你必须从另一边开始,即 hierarchy1。

  1. 获取层次结构 1 (top-to-bottom)

     TRAVERSE out("CHILD") FROM Car
    
  2. 选择所有关系

    SELECT out("MADE_IN) FROM ([1])
    
  3. 然后从这些开始,bottom-to-top

    TRAVERSE in("CHILD") FROM ([2])
    
  4. 谁在上面?

    SELECT FROM ([3]) WHERE @class="Country"
    

合并成一个sql,丑成这样:

    SELECT FROM (
       TRAVERSE in("CHILD") FROM (
          SELECT out("MADE_IN") FROM (
             TRAVERSE out("CHILD") FROM Car
          )
       )
    ) WHERE @class="Country"

您可以将 Car 替换为 hierarchy1 中的任何 @rid 以获取其或其中任何部分的制造国家/地区列表。

肯定会有更好的解决方案。但至少这个应该有用,所以我希望它能有所帮助。