2015-10-26 58 views
0

我試圖遍歷一些節點,並且我想在最遠的節點匹配某個條件時停止遍歷。orientdb遍歷,直到節點上的條件

我的數據是一些依次連接的節點 - 有一個樣本數據創建腳本這裏(注意,這是很多從我的實際數據的簡化,只是爲了說明問題):

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) 

讓我們定義一個序列來自沒有輸入鏈接的節點的節點遍歷(一個開始節點)。我正在嘗試編寫一個查詢,它將返回所有節點序列,直到在遍歷中遇到特定名稱的第一次出現爲止。假設具體的名字是'Mike'。因此,對於這個數據我希望可以找到以下順序:

("Laura", 75, 5) -> ("Mike", 16.3, 15), 
("Laura", 46, 7) -> ("Mike", 16.3, 13), 
("Mike", 16.3, 8) 

我只是一個「邁克」之前得到一個特定的節點到節點的順序。下面的查詢返回我的記錄(「勞拉」,75,5),作爲一個後記錄具有名稱「邁克」

traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Mike' 

下面的查詢返回了我兩行,一行與唱片(「勞拉」,作爲麥克命名爲「愛麗絲」之後的記錄(「邁克」,16.3,15)。

traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice' 

我有兩個問題 - 首先,我想包括匹配的序列中的狀態(即一個名爲「邁克」人檢查的時候,我想「邁克」的節點是序列中的最後節點返回)

對於我假定我需要遍歷存儲在一個對象,並請求一個以上失去接着該對象返回之前。我試過各種方法來將遍歷存儲在查詢中的對象中,但我只是沒有得到它。下面是一個例子(錯誤):

select from (
    select $seq from 
    (select from Person where ident = 5) 
    let $seq = traverse out('NEXT') from $current while name <> 'Alice'   
    <... here append the next node ...> 
) 

其次,這個查詢只從一個節點開始 - 我想開始在所有節點出發並返回「邁克」結尾的地方有一個序列。我希望一旦我可以將遍歷存儲在一個對象中,它應該相對簡單,從多個起點運行而不只是一個起點。 (當然,這個特定查詢的另一個選項是找到所有匹配特定條件的節點(例如name ='Mike')並且從這些節點向後工作,但是我真的很希望看到它在工作我最初描述的方式,因爲我需要以後的更多事情的一般方法。)

我懷疑我的問題很多是我真的很努力地研究如何在OrientDB中使用let語句 - 我真的不理解範圍如何工作,哪些對象存在於查詢的哪些階段。如果有人知道除了官方文檔以外的任何好文檔,這些文檔在我閱讀過這些文檔時會非常有用,而且我還沒有得到它。

那麼如何回答這個問題,或在哪裏可以找到關於如何寫這種類型的查詢更多信息任何有用的提示還是很有用的。

回答

0

我希望它可以幫助你

select expand($c) let $b=(select expand(out("NEXT")[name="Alice"]) from (select expand(last($a)) from (select from Person where ident = 5) 
let $a = (traverse out('NEXT') from $current while name <> 'Alice')) limit 1), $c=unionAll($a,$b) 
+0

感謝 - 你知道,如果unionAll保證保存排序? (即$ b是一條記錄,$ a是一組記錄。我總是希望在生成的聯合$ c中的$ c之後出現$ b)。我找不到任何可以保證甚至提到的文檔,所以我不確定。 – arbie

+0

我認爲unionAll($ C,$ B)中所產生的 –

0
select name, list from (select name,$c.name as list from Person 
let $b=(select expand(out("NEXT")[name="Alice"]) from (select expand(last($a)) from $parent.$current 
let $a = (traverse out('NEXT') from $current while name <> 'Alice')) limit 1), 
$c=unionAll($a,$b) where in("NEXT").size()=0) 
where list contains "Alice" 
+0

,幾乎工程,由於把$ B $ C後!你的口水確實幫助我更多地理解語法。有一個小問題,如果我詢問通往'邁克'的路徑,它不會返回任何以'邁克'開頭的路徑 - 參見我的原始描述中的(「邁克」,16.3,8)。我想我可以做你的結果和查詢的聯合,找到起始節點是「邁克」的場合。 – arbie