2015-10-27 1 views
2

Я изо всех сил пытаюсь понять, когда расширение будет работать в OrientDB. Мое понимание расширения применительно к МПОГ заключается в том, что оно возвращает документ (и все его поля) http://orientdb.com/docs/2.1/SQL-Functions.html#expandиспользуя расширение в orientdb на RID и коллекциях

Я иногда получаю результаты от применения расширения до МПОГ.

Здесь я приведу несколько примеров данных и приведу пример моей проблемы. Образцами данных являются узлы Person, соединенные краями «NEXT».

create database plocal:people 
create class Person extends V 
create property Person.name string 
create property Person.age float 
create property Person.ident integer 


insert into Person(name,age,ident) VALUES ("Bob", 30.5, 1) 
insert into Person(name,age,ident) VALUES ("Bob", 30.5, 2) 
insert into Person(name,age,ident) VALUES ("Carol", 20.3, 3) 
insert into Person(name,age,ident) VALUES ("Carol", 19, 4) 
insert into Person(name,age,ident) VALUES ("Laura", 75, 5) 
insert into Person(name,age,ident) VALUES ("Laura", 60.5, 6) 
insert into Person(name,age,ident) VALUES ("Laura", 46, 7) 
insert into Person(name,age,ident) VALUES ("Mike", 16.3, 8) 
insert into Person(name,age,ident) VALUES ("David", 86, 9) 
insert into Person(name,age,ident) VALUES ("Alice", 5, 10) 
insert into Person(name,age,ident) VALUES ("Nigel", 69, 11) 
insert into Person(name,age,ident) VALUES ("Carol", 60, 12) 
insert into Person(name,age,ident) VALUES ("Mike", 16.3, 13) 
insert into Person(name,age,ident) VALUES ("Alice", 5, 14) 
insert into Person(name,age,ident) VALUES ("Mike", 16.3, 15) 

create class NEXT extends E 

create edge NEXT from (select from Person where ident = 1) to (select from Person where ident = 3) 
create edge NEXT from (select from Person where ident = 2) to (select from Person where ident = 4) 
create edge NEXT from (select from Person where ident = 8) to (select from Person where ident = 12) 
create edge NEXT from (select from Person where ident = 5) to (select from Person where ident = 15) 
create edge NEXT from (select from Person where ident = 15) to (select from Person where ident = 14) 
create edge NEXT from (select from Person where ident = 7) to (select from Person where ident = 13) 
create edge NEXT from (select from Person where ident = 13) to (select from Person where ident = 10) 
  1. Этот фрагмент кода находит обходов из узла с идент 5, пока не натыкается на Алису. Он возвращает одну строку с набором из двух RID: RID для Laura (идентификатор 5) и RID для Mike (идентификатор 15), потому что за Майком следует Алиса.

    select $a 
        let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice') 
    
  2. Если я применяю расширить до $a, я получаю таблицу результатов с двумя строками, которые содержат данные для этих двух записей. Я не знаю, связано ли это с expand о коллекциях (скоро будет отказано в пользу unwind?) Или expand на RID или обоих.

    select expand($a) 
        let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice') 
    
  3. Если разматывает $a я получаю таблицу результатов с двумя строками, которые содержат RID, для этих двух записей. (Это имеет смысл для меня)

    select $a 
        let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice') 
        unwind $a 
    
  4. Если я expandunwind от 3, я получаю тот же результат, как от 2, что позволяет предположить, что 2 разматывают и расширил Люди узлы

    select expand($a) 
        let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice') 
        unwind $a 
    
  5. Я могу выбрать последний RID в коллекции RID, возвращаемых 1. Это дает мне таблицу с 1 строкой, которая содержит RID, который является последним Лицом перед Алисой.

    select last($a) 
    let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice') 
    
  6. Если я расширяю этот результат, я получаю 0 строк. Это действительно не то, что я ожидал - я бы ожидать, чтобы получить одну строку с расширенными рекордными деталей для звукозаписывающих деталей возвращенных в части 5

    select expand(last($a)) 
        let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice') 
    

Может кто-нибудь пролить свет на почему расшириться в части 6 не расширяет RID, возвращаемый last($a)?

Также, если кто-то точно знает, что происходит в части 2 - сразу ли применяются оба определения расширения - это поможет.

EDIT

Причудливо, этот фрагмент кода, кажется, делать то, что я хочу, пункт 6, чтобы сделать, но я не знаю, почему. Думал, что это может спровоцировать чью-то память о том, что происходит (точка моего вопроса состоит в том, чтобы понять, почему некоторые вещи работают, а некоторые - нет, вместо того, чтобы получать какой-либо запрос, который работает в этом конкретном случае, поэтому, к сожалению, этот рабочий фрагмент не закрываем этот вопрос.)

select expand(last($a)) 
     from (select from Person where ident = 5) 
      let $a = (traverse out('NEXT') from $current while name <> 'Alice') 

ответ

2

1) Траверс возвращает все записи, которые он посещает, и которые соответствуют предписанию while. В этом случае это всего 2 записи.

2) Развертывание принимает все rids в «коллекции» и возвращает эти записи, фактически удаляя запрос, содержащий коллекцию. На самом деле я только что узнал, что они обескураживают расширение для разговора, и я не уверен, почему, поскольку они, кажется, служат двум различным целям. Разморозка больше похожа на JOIN в РСУБД.

3) Вы разматывали результаты против ничего, поэтому похоже, что вы получаете только $ a 'cell' за строку, но на самом деле вы ничего не получаете и $ a. Возможно, это будет способствовать большей очистке, select *, $a from (select from Person limit 1) let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice') unwind $a

4) Когда вы расширяете, вы заменяете исходный запрос, поэтому все, что вам нужно, это записи в расширенном поле.

5) Да.

6) Думаю, вы нашли ошибку. first() и last() должны возвращать текст или что-то, а не указатель. Следующие реплики expand(first($a)) и работает, следовательно, моя презумпция ошибки; select expand($a[0]) let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')

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