1

我有一些关于东方 SQL 查询的语义问题。

以这个非常简单的图表为例:

v(#12:1 User) --> e(#13:1 FriendOf) --> v(#12:2 User)

换句话说,去掉#12:1 的给定用户是去掉#12:2 的另一个用户的朋友。

为了得到用户 #12:1 的朋友,可以用 Orient SQL 像这样表达这一点:

SELECT EXPAND(both("FriendOf")) FROM #12:1

此查询将返回一个结果列表,该列表由具有 rid #12:2 的用户组成。

现在假设我想通过附加条件过滤该结果列表,例如数值(“年龄”):

SELECT EXPAND(both("FriendOf")) FROM  #12:1 WHERE age >= 10

上面的查询将过滤当前顶点 (#12:1),而不是结果集。这是有道理的,但是有没有办法将过滤器应用于 EXPAND(both("FriendOf")) 结果而不是当前顶点?我知道我可以像这样用 gremlin 做到这一点:

SELECT EXPAND(gremlin('current.both("FriendOf").has("age",T.gte,10)')) FROM #12:1

但是上面似乎没有使用索引(至少在我要求它解释时没有)。对于非常大的数据集,这是有问题的。

那么有没有合适的方法将 WHERE 语句应用于结果数据集?

谢谢 !

4

1 回答 1

0

...有没有办法将过滤器应用于 EXPAND(both("FriendOf")) 结果而不是当前顶点?

简单的答案是将您的基本“SELECT EXPAND ...”嵌入另一个SELECT,即

SELECT FROM (SELECT EXPAND(both("FriendOf")) FROM #12:1) WHERE age >= 10

顺便说一句,在我的 Mac 上,上述操作耗时 0.005 秒,而 Gremlin 版本则超过 2 秒。那里一定有道德:-)

于 2015-12-07T21:31:44.773 回答