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')
一共有三个音符。用户可以看到 note0 和 note1。 note0 在 folder0 中,note1 在 folder1 中。
假设我们希望 folder0 中的所有笔记用户都能看到。上面的查询将 return note0.
我在这方面还很陌生,所以我将继续讨论这个案例。
在我们的应用程序中,我们有笔记可以在用户之间共享并存储在文件夹中。单个笔记显然可以在多个文件夹中(不能共享)。到目前为止,我们使用此查询来显示文件夹中的笔记:
(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')
一共有三个音符。用户可以看到 note0 和 note1。 note0 在 folder0 中,note1 在 folder1 中。
假设我们希望 folder0 中的所有笔记用户都能看到。上面的查询将 return note0.