2015-05-22 91 views
1

我建立一個聊天室引擎和我有一個曲線圖,像這樣:質疑OrientDB圖

User---Started--->Room----Discuss--->Item<---Own---User 

我想獲得的所有項目及相關的項目爲特定用戶的roomId。

select 
    *, in('Discuss').in('Started')[name ='julie'] as roomId 
    from item 

所以這是怎麼回事扔正確「房間」,發現了一個由「朱莉」開始,但它返回朱莉的ID,我如何得到這個查詢室的標識? 這就像我需要做一個'回',並得到@rid ...

我是新來的圖,所以任何指針,將不勝感激。

+0

請說明你想要查詢返回。 1)所有的項目和這些項目的任何房間由用戶'朱莉'開始。 2)只有Julie開始有房間的物品。 – neRok

回答

2

這個答案是基於我的意見到原始問題的選項(1),正如你指出here,「我想要所有的物品不僅僅是那些有julie房間首發的物品」。

SELECT *, $rooms_by_user FROM items LET $rooms_by_user = (SELECT FROM (SELECT expand(in('Discuss')) FROM $parent.$current) WHERE in('Started').Name contains 'Julie') 

所以原來的查詢越來越所有項目,並添加自定義字段到輸出(LET子句和$ rooms_by_user場)。

$ rooms_by_user的內部查詢正在擴展每個「Item」(此項每個項目都運行)的'Discuss'邊緣,從而返回與'Item'關聯的所有'Room'頂點。查詢的外部部分然後過濾'房間'頂點,只有名爲'Julie'的'用戶'開始的頂點。

我不得不使用包含在外部查詢中,因爲in('Started').Name返回一個列表,例如["Julie"]

通過rid過濾用戶可能會更好,那麼您只需要對「Started」邊的out屬性進行過濾(即數據庫只需要從頂點到邊「跳」一次,而不是從頂點到邊緣到頂點 - 只有當你不使用輕量級邊時,這纔是真實的,這是當前版本的默認設置。)。

1

假設你的圖具有頂點和邊緣類,是一種結構類似的:

enter image description here

您可以使用select和圖形traverse查詢的組合來回報你所需要的。例如:

select from (traverse both('discuss'), both('started') from #14:0) 
    where (@class='room') 
    or (@class='user' and name='Julie') 

這將返回以下結果(JSON格式)

{ 
"result": [ 
    { 
     "@type": "d", 
     "@rid": "#13:0", 
     "@version": 3, 
     "@class": "room", 
     "name": "Baking", 
     "in_started": [ 
      "#15:0" 
     ], 
     "out_discuss": [ 
      "#16:0" 
     ], 
     "@fieldTypes": "in_started=g,out_discuss=g" 
    }, 
    { 
     "@type": "d", 
     "@rid": "#12:0", 
     "@version": 2, 
     "@class": "user", 
     "name": "Julie", 
     "out_started": [ 
      "#15:0" 
     ], 
     "@fieldTypes": "out_started=g" 
    } 
], 
"notification": "Query executed in 0.027 sec. Returned 2 record(s)" 

}

更新:

如果你只是想返回的@rid您可以用另一個選擇包裝上述查詢的房間:

select @rid from 
    (select from (traverse both('discuss'), both('started') from #14:0) 
    where (@class='room') 
    or (@class='user' and name='Julie')) 
where @class='room' 
+0

謝謝你的回答阿米特,但我想要獲得作爲一個財產roomId的所有項目。該項目鏈接到由特定用戶啓動的房間。所以我正在尋找所有物品的清單;和一個項目有一個房間'正在訪問該網站的用戶'開始'我有roomId關聯到該項目... – Brett

+0

有更多的上下文https://groups.google.com/forum/ #!話題/方位數據庫/ 50zN5O1glNU – Brett