Orientdb - 具有多个边的where子句

时间:2015-04-17 07:04:43

标签: graph-databases orientdb

我还是很陌生,所以我会谈谈此案。

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

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

但是现在,我们正在开发一些“高级过滤器”,我们希望在这些过滤器中显示特定文件夹内的注释或不在其中的注释。注释也可以被标记(通过单个标记),因此使用非常简单“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的信息 但我无法让它发挥作用。

执行此操作的正确语法是什么,或者整个方法是不是很糟糕。如果基本问题是什么,这样做的好方法是什么?感谢您的帮助,并对我在语法中所犯的所有错误表示抱歉。

1 个答案:

答案 0 :(得分:2)

我相信您正在寻找的查询是:

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 中的所有笔记。上面的查询将返回 note0