分层数据的 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 (top-to-bottom)
TRAVERSE out("CHILD") FROM Car
选择所有关系
SELECT out("MADE_IN) FROM ([1])
然后从这些开始,bottom-to-top
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"
您可以将 Car 替换为 hierarchy1 中的任何 @rid 以获取其或其中任何部分的制造国家/地区列表。
肯定会有更好的解决方案。但至少这个应该有用,所以我希望它能有所帮助。
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 (top-to-bottom)
TRAVERSE out("CHILD") FROM Car
选择所有关系
SELECT out("MADE_IN) FROM ([1])
然后从这些开始,bottom-to-top
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"
您可以将 Car 替换为 hierarchy1 中的任何 @rid 以获取其或其中任何部分的制造国家/地区列表。
肯定会有更好的解决方案。但至少这个应该有用,所以我希望它能有所帮助。