OrientDB遍历(子),同时连接到顶点并获得另一个顶点

时间:2016-12-21 13:11:48

标签: orientdb traversal graph-databases gremlin

我不确定标题是说出它的最佳方式,这是结构:

Structure

如果你想导入它以测试它,那么这是db json备份:http://pastebin.com/iw2d3uuy

我想让生活在大陆1的人类吃掉菜肴,直到_Parent Human搬到大陆2。 这意味着目标是Dish 1& 2。

如果父母移居到另一个大陆,即使他们搬回大陆1,我也不想要他们的菜肴和他们孩子的菜肴。 我不知道这是否重要,但一个人可以有多个孩子。

如果没有关于移出欧洲大陆的人类子女的条件,这个查询就会有效:

SELECT expand(in('_Is_in').in('_Lives').in('_Eaten_by'))
FROM Continent WHERE continent_id = 1

但我猜这里我们被迫使用(除其他外)

TRAVERSE out('_Parent') FROM Human WHILE

我尝试使用带有子查询的遍历的while来获取我感兴趣的所有人类,然后尝试获取Dishes,但我甚至不确定我们可以使用子查询。

我希望该结构能够帮助其他用户快速找出这个查询是否对他们有用。如果有人想知道,我使用OrientDB Studio的Graph选项卡和GIMP一起制作它。

作为奖励,如果有人知道Gremlin语法,那么学习它也会很有用。

请随意编辑您认为合适的帖子并提出您的想法:)

1 个答案:

答案 0 :(得分:0)

SELECT expand(in('_Eaten_by'))
FROM (TRAVERSE out('_Parent')
      FROM (SELECT from Human WHERE in('_Parent').size() = 0)
      WHILE out('_Lives').out('_Is_in').continent_id = 1)

说明:

  • TRAVERSE out('_Parent') FROM (SELECT FROM Human WHERE in('_Parent').size() = 0) WHILE out('_Lives').out('_Is_in').continent_id = 1

返回人类1和2.

该查询遍历Human,从Human 1开始,而Human连接到Continent 1。

它从in('_Parent').size() = 0开始,它们是没有任何_Parent的人类(在这种情况下只有人类1)(size()是来自_Parent的顶点集合的大小。)

  • SELECT expand(in('_Eaten_by')) FROM

得到菜肴,从我们从遍历中获得的人类开始并经过边缘_Eaten_by。

注意:请务必始终在顶点和边名称周围使用',否则似乎不会考虑名称。