OrientDB查询分层数据

时间:2015-06-04 17:24:45

标签: orientdb

OrientDB Server v2.0.10, 我正在尝试针对以下场景提出查询。

我有2个层次结构:A-> B-> C和D-> E-> F 层次结构中的节点数可以更改。 第一层次结构中的节点可以使用某些关系“分配”连接到另一个层次结构。 我想要的是第二层次结构的父节点,如果从第一层到第二层次结构中的任何节点有任何进入边缘。

例如,假设我们有Car-Child-> Engine-Child-> Piston和Country-Child-> State-Child-> City 以及将汽车或发动机或活塞与国家,州或城市联系起来的关系Made_In 因此,如果与国家或州或城市存在关系,则应返回国家/地区。例如,Engine1-Made_In->柏林,这将返回德国。 抱歉这样一个玩具的例子。我希望很清楚。

感谢。

1 个答案:

答案 0 :(得分:3)

你应该考虑阅读关于"遍历"的章节。 - 这应该是回答你问题的缺失环节。您可以在此处找到它:http://orientdb.com/docs/last/SQL-Traverse.html

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

  • 从树1中查找给定家庭成员的所有子女,孙子女,曾孙子女等(=等级1)

  • 查找与其他家谱成员有关系的人(=已分配)

  • 告诉我这棵树上的人(= Hierarchy2)

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

由于您希望最终位于hierarchy2之上,因此您必须从另一侧开始,即hierarchy1。

  1. 获取hierarchy1(从上到下)

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

    SELECT out("MADE_IN) FROM ([1])
    
  3. 从这些中,自下而上

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

    SELECT FROM ([3]) WHERE @class="Country"
    
  5. 组合成一个sql,它看起来像这样丑陋:

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

    你可以用层次1中的任何@rid替换Car来获取它或其任何部分所在国家的列表。

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