【问题标题】:Orient SQL - Filter result set using WHERE?Orient SQL - 使用 WHERE 过滤结果集?
【发布时间】:2015-12-07 17:25:18
【问题描述】:

我有一点关于东方 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 语句应用于结果数据集?

谢谢!

【问题讨论】:

  • 这似乎也有效,但也不使用索引:SELECT EXPAND(both("FriendOf")[age >= 10]) FROM #12:1

标签: orientdb orientdb-2.1 orient-sql


【解决方案1】:

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

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

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

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

【讨论】:

  • @nightrise - 我真的不明白为什么在 SELECT FROM (SELECT EXPAND(_) ....) ... 语句中调用 EXPAND 是必要的。你?无论如何,我能够找到的关于 EXPAND 的 OrientDB 文档非常不起眼。如果您有同样的印象,也许我们中的一个人应该在github.com/orientechnologies/orientdb/issues 创建一个文档 ER ...)
  • 我认为不同之处在于,如果没有 EXPAND,您基本上只会获得记录 id (@rid)。使用 EXPAND,您基本上是在告诉它通过遍历链接来获取实际的记录数据。例如,对于给定的用户顶点“Bob”,其“FriendOf”边将其连接到其他用户顶点,“Bob”顶点文档有一个 RID 列表,这些 RID 表示到边的链接(或“轻量级”中的顶点)边缘)。那有意义吗?是的,我倾向于尽可能使用 Orient SQL,因为在许多情况下它看起来确实更快!
  • 我应该补充一点,有时您不想遍历链接,只是为了检索摆脱或检查它的存在。我自己亲自使用过它,当您不需要整个数据集时,它会在性能上产生很大差异(尤其是在使用轻量级边缘时)。
  • @nightrise - 正如 OrientDB 文档所解释的,EXPAND(_) 有两个用途——“在集合字段上使用时,它会展开字段中的集合......当在链接上使用时( RID) 字段,它扩展了该链接指向的文档。”在您的查询中,我相信第一种情况适用。我不明白为什么 both() 不做“扩展”。事实上,我倾向于说这是一个错误或功能错误。
  • 实际上我认为它是第二种情况(扩展了该链接指向的文档)。 EXPAND 应用于作为边/链接的 both("FriendOf")。它遍历它并将链接(摆脱引用)“解析”到其整个文档。我不认为它是一个错误,拥有它是有道理的,因为您不一定想解决它 - 有时您只是想找回摆脱。
猜你喜欢
  • 2022-01-03
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
  • 1970-01-01
相关资源
最近更新 更多