Orientdb - 多条边的 where 子句

Orientdb - where clause with multiple edges

我在这方面还很陌生,所以我将继续讨论这个案例。

在我们的应用程序中,我们有笔记可以在用户之间共享并存储在文件夹中。单个笔记显然可以在多个文件夹中(不能共享)。到目前为止,我们使用此查询来显示文件夹中的笔记:

(select expand(both(\'InFolder\')) from @folder_rid)

但是现在,我们正在开发一些 "advanced filters",我们希望在其中显示特定文件夹内的笔记或不在其中的笔记。笔记也可以被标记(通过单个标签)所以它是使用 "where clause"

非常简单
SELECT FROM (select expand(both(\'CanView\')) from @user_rid) where out(\'HasTag\').@rid = @tag_rid

SELECT FROM (select expand(both(\'CanView\')) from @user_rid) where out(\'HasTag\').@rid <> @tag_rid

现在问题来了。由于笔记可以存储在多个文件夹中,因此上述方法不起作用。当我指定边缘数组中的哪个位置时它起作用(?)目标文件夹应该是:

SELECT FROM (select expand(both(\'CanView\')) from @user_rid) where out(\'InFolder\')[0].@rid = @folder_rid
SELECT FROM (select expand(both(\'CanView\')) from @user_rid) where out(\'InFolder\')[1].@rid = @folder_rid

但显然这不是这样做的方法。 我发现 (http://orientdb.com/orientdb-improved-sql-filtering/) 我可以使用范围来做到这一点,比如

SELECT FROM (select expand(both(\'CanView\')) from @user_rid) where out(\'InFolder\')[0-2].@rid = @folder_rid

但它只是计算方括号内的值(oO)。 我还尝试使用 [1,2,3] 并使用来自 https://code.google.com/p/orient/wiki/Document_Field_Part 的信息 但我无法让它工作。

执行此操作的正确语法是什么,或者整个方法都不好。如果问题出在基础上,那么这样做的好方法是什么?感谢您的帮助,对于我在语法上犯下的所有错误感到抱歉。

我相信您要查找的查询是:

SELECT 
FROM (SELECT expand(out('CanView')) FROM <user_rid>) 
WHERE <folder_rid> IN out('InFolder')

一个例子:

create class User extends V
create class Note extends V
create class Folder extends V


create class CanView extends E
create class InFolder extends E


create vertex User set name = 'user'
create vertex Note set name = 'note0'
create vertex Note set name = 'note1'
create vertex Note set name = 'note2'
create vertex Folder set name = 'folder0'
create vertex Folder set name = 'folder1'


create edge CanView from (select from User where name = 'user') to (select from Note where name = 'note0')
create edge CanView from (select from User where name = 'user') to (select from Note where name = 'note1')

create edge InFolder from (select from Note where name = 'note0') to (select from Folder where name = 'folder0')
create edge InFolder from (select from Note where name = 'note1') to (select from Folder where name = 'folder1')
create edge InFolder from (select from Note where name = 'note2') to (select from Folder where name = 'folder1')

一共有三个音符。用户可以看到 note0note1note0folder0 中,note1folder1 中。

假设我们希望 folder0 中的所有笔记用户都能看到。上面的查询将 return note0.