2015-04-17 2 views
1

Я все еще совершенно новый, поэтому я просто зайду к делу.Orientdb - где предложение с несколькими краями

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

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

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

SELECT FROM (select expand(both(\'CanView\')) from @user_rid) where out(\'HasTag\')[email protected] = @tag_rid 

или

SELECT FROM (select expand(both(\'CanView\')) from @user_rid) where out(\'HasTag\')[email protected] <> @tag_rid 

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

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

Но, очевидно, это не способ сделать это. я нашел (http://orientdb.com/orientdb-improved-sql-filtering/), что я могу использовать диапазоны, чтобы сделать это, как

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

Но он просто вычисляет значение внутри квадратных скобок (СОО). Я также пробовал с [1,2,3] и использовал информацию от https://code.google.com/p/orient/wiki/Document_Field_Part , но я не мог заставить его работать.

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

ответ

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 и примечание1. примечание0 есть в папка0, примечание1 есть в папка1.

Предположим, мы хотим, чтобы все примечания в folder0 пользователь мог видеть. Запрос выше вернет note0.

+0

благодарит Бога, как один час назад я получаю подобный метод, но как-то я просто застрял в этих диапазонах и закончилась 'WHERE Ушло («InFolder») [0-99]' Что на первый взгляд имеют серьезный недостаток ;) Еще раз, спасибо! – Vini

+0

Рад, что я мог помочь :) – vitorenesduarte

Смежные вопросы