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->柏林,这将返回德国。 抱歉这样一个玩具的例子。我希望很清楚。
感谢。
答案 0 :(得分:3)
你应该考虑阅读关于"遍历"的章节。 - 这应该是回答你问题的缺失环节。您可以在此处找到它:http://orientdb.com/docs/last/SQL-Traverse.html
基本上,如果您将图表视为家谱,您希望实现3件事:
从树1中查找给定家庭成员的所有子女,孙子女,曾孙子女等(=等级1)
查找与其他家谱成员有关系的人(=已分配)
告诉我这棵树上的人(= Hierarchy2)
其中一个可能的解决方案应该看起来像这样:
由于您希望最终位于hierarchy2之上,因此您必须从另一侧开始,即hierarchy1。
获取hierarchy1(从上到下)
TRAVERSE out("CHILD") FROM Car
选择所有关系
SELECT out("MADE_IN) FROM ([1])
从这些中,自下而上
TRAVERSE in("CHILD") FROM ([2])
谁在上面?
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"
你可以用层次1中的任何@rid替换Car来获取它或其任何部分所在国家的列表。
可能有更好的解决方案。但至少这个应该有用,所以我希望它会有所帮助。