2015-03-17 2 views
0

Введение:OrientDB друг запрос друзей с дополнительной информацией и фильтрации

Привет,

У меня есть вопрос о том, как создать запрос OrientDB. Запрос должен получить все вершины друзей друзей (это эквивалентно отношениям второго уровня) + мост между 2. После этого запрос должен фильтровать записи после свойства edge.

Я бегу OrientDB 1.7.4.

схемы Пример:

Давайте рассмотрим пример, принимая следующую схему:

-> Пользователь является Vertex, со свойством ID (INT)

-> Знает это край , с типом свойства (строка) (скажем, это свойство имеет несколько значений: друг, семья и т. д.)

Отношения, которые я ищу, это вот так:

User <--knows--> User <--knows--> User 
(1)    (2)    (3) 

Мне нужны все отношения, не имеет значения, в каком направлении они имеют (даже если направление важно для других запросов).

Чтобы получить все пользователи (User3) второй степени, запрос, как это будет достаточно:

select expand(set(both().both())) from <rid> 

Вопросы:

Теперь у меня есть 2 основные проблемы/вопросы, которые я не могу понять их:

  1. Если запрос выше возвращает список записей из класса User (USER3), как я могу получить запись в качестве пользователя (USER3) A ND Пользователь (или идентификатор свойства) от пользователя в середине отношения (см. Выше: User2)

  2. Как фильтровать запрос для перемещения (или выбора) только через ребра, имеющие определенное свойство. Чтобы быть более конкретным, я хочу, чтобы второй запрос нашел пользователей, которые из вопроса 1, но являются друзьями друзей: User <--knows(method='friend')--> User <--knows(method='friend')--> User.

+0

Это 'выбрать Бот («знает») [метод =«друг»] из User' дает вам края с помощью метода «friend». Может быть, это может вам помочь. – vitorenesduarte

+0

Привет, возьмите ваш ответ. Это помогает, но это не совсем то, что я ищу. Таким образом, я могу получить ребра, но не вершины. Мне нужен мой вывод для класса User. – ashcrok

ответ

1

Как предложил vitorenesduarte, я нашел ответ. Да я должен искать края, фильтровать края, чем вынуть вершины из краев, как следующее:

select expand(unionAll(inE('knows')[method='friend'].out, outE('knows')[method='friend'].in) from <rid> 

Проблема с этим запросом, что я думаю, что это может быть оптимизирован, если OrientDB будет иметь функцию принимать как способ вершины из ребер, что-то вроде этого:

bothE('knows')[method='friend'].both 

Но функция .both не существует (по крайней мере, в версии я использую, который 1.7.4). Если кто-то знает об этом, оставьте комментарий.

+0

Я считаю, что __out__ здесь: 'inE ('знает') [method = 'friend']. Out' является свойством, а не функцией. И вот почему. Оба не сработают. – vitorenesduarte

+0

вы можете использовать оба V(), как описано в моем ответе выше – Sebastian

0

Вы можете сделать:

TREVERSE * FROM (SELECT FROM User WHERE id == 1) 
WHILE (@class == 'User') OR (@class == 'Knows' AND method == 'friend') 

Это даст вам все вершины и ребра, начиная с вершины с ид = 1.

Если вы хотите, чтобы остановить на 2-м уровне, а затем

TREVERSE * FROM (SELECT FROM User WHERE id == 1) 
WHILE (@class == 'User') OR (@class == 'Knows' AND method == 'friend') 
MAXDEPTH 2 

Если вы хотите иметь вершины:

SELECT FROM (
    TREVERSE * FROM (SELECT FROM User WHERE id == 1) 
    WHILE (@class == 'User') OR (@class == 'Knows' AND method == 'friend') 
    MAXDEPTH 2 
) 
WHERE @class == 'User ' 

Если вам нужно знать путь от начального человека до последнего и все возможные пути от id = 1 до 2-го уровня.

SELECT $path FROM (
     TREVERSE * FROM (SELECT FROM User WHERE id == 1) 
     WHILE (@class == 'User') OR (@class == 'Knows' AND method == 'friend') 
     MAXDEPTH 2 
    ) 

Но если у вас есть фиксированная глубина лучше делать это с выбором, попробуйте следующее:

SELECT bothE('Knows')[method='friend'].bothV() FROM User WHERE id = 1 
Смежные вопросы