【问题标题】:Orientdb - where clause with multiple edgesOrientdb - 具有多条边的 where 子句
【发布时间】:2015-04-17 07:04:42
【问题描述】:

我在这方面还很陌生,所以我会直接去看看这个案例。

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

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

但是现在,我们正在开发一些“高级过滤器”,我们希望在其中显示特定文件夹内的笔记或不在其中的笔记。笔记也可以标记(通过单个标记),因此使用起来非常容易“where子句”

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 的信息 但我无法让它工作。

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

【问题讨论】:

    标签: graph-databases orientdb


    【解决方案1】:

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

    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')
    

    共有三个音符。用户可以看到 note0note1note0folder0note1folder1

    假设我们希望用户可以看到 folder0 中的所有笔记。上面的查询将返回 note0

    【讨论】:

    • 上帝感谢,就像一小时前我得到了类似的方法,但不知何故我只是停留在这些范围并以WHERE &lt;folder_rid&gt; IN out('InFolder')[0-99] 结束,乍一看有严重的缺点;)再一次,谢谢!跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2014-09-03
    • 2021-11-07
    • 2013-12-31
    相关资源
    最近更新 更多