Orientdb — предложение where с несколькими ребрами

Я все еще новичок в этом, поэтому я просто перейду к делу.

В нашем приложении есть заметки, которыми можно делиться между пользователями и хранить в папках. Одна заметка, очевидно, может находиться в нескольких папках (которые не могут быть общими). До сих пор для отображения заметок в папке мы использовали этот запрос:

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

Но теперь мы разрабатываем некоторые «расширенные фильтры», в которых мы хотим показывать заметки, которые находятся в определенной папке, или те заметки, которых нет в ней. Заметки также могут быть помечены (одним тегом), поэтому это было довольно легко, используя предложение "

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

or

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, но мне не удалось заставить его работать.

Каков правильный синтаксис для этого или весь этот подход просто плохой. Если проблема в основах, каков хороший способ сделать это? Спасибо за помощь и извините за все ошибки, которые я сделал в грамматике.


person Vini    schedule 17.04.2015    source источник


Ответы (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')

Есть три заметки. Пользователь может видеть note0 и note1. note0 находится в folder0, note1 находится в folder1.

Допустим, нам нужны все заметки в folder0, которые видит пользователь. Приведенный выше запрос вернет note0.

person vitorenesduarte    schedule 17.04.2015
comment
Боже, спасибо, как и час назад, я получил аналогичный метод, но почему-то я просто застрял на этих диапазонах и закончил с WHERE <folder_rid> IN out('InFolder')[0-99] Который на первый взгляд имеет серьезный недостаток ;) Еще раз, спасибо! - person Vini; 17.04.2015