簡體   English   中英

OrientDB從查詢中選擇頂點,邊對

[英]OrientDB select Vertex, Edge pairs from query

在OrientDb圖數據庫中,我試圖獲取有關“頂點”,“邊緣”對的信息。

例如,考慮以下情況:

V1 ---E1---> V2
   ---E2---> V3 --E3--> V2

結果,我希望獲得以下3行;

V1, E1
V1, E2
V3, E3

我嘗試了以下方法:

select label, flatten(out.label) from V
select label from (select flatten(out) from V)
select label, flatten(out) from V
select flatten(out) from V
select $current, label from (traverse out from V while $depth <= 1) where $depth = 1

但是這些解決方案似乎都沒有返回我想要的。 如何返回頂點,邊對?

FLATTEN運算符是單獨工作的,因為得到一個字段並使其成為結果。 我不明白你想做什么。 你能寫出預期的輸出嗎?

對於OrientDB,您實際上想做的事情非常簡單,似乎您對此問題的思考過多。

讓我們創建您的示例:

V1 ---E1---> V2
   ---E2---> V3 --E3--> V2

在OrientDB中,您將執行以下操作:

/* Create nodes */
CREATE CLASS Node EXTENDS V
CREATE PROPERTY Node.name STRING (MANDATORY TRUE)
CREATE VERTEX Node SET name = 'V1'
CREATE VERTEX Node SET name = 'V2'
CREATE VERTEX Node SET name = 'V3'

/* Create edges */
CREATE CLASS Link EXTENDS E
CREATE PROPERTY Link.name STRING (MANDATORY TRUE)
CREATE EDGE Link
    FROM (SELECT FROM Node WHERE name = 'V1') 
    TO (SELECT FROM Node WHERE name = 'V2')
    SET name = 'E1'
CREATE EDGE Link
    FROM (SELECT FROM Node WHERE name = 'V1')
    TO (SELECT FROM Node WHERE name = 'V3')
    SET name = 'E2'
CREATE EDGE Link 
    FROM (SELECT FROM Node WHERE name = 'V3')
    TO (SELECT FROM Node WHERE name = 'V2')
    SET name = 'E3'

這將創建以下圖形:

示例OrientDB圖

現在對如何在OrientDB中進行查詢進行一些解釋。 假設您加載了一個頂點: SELECT * FROM Node WHERE name = 'V1' 然后,要加載其他信息,請使用:

  • 加載所有傳入的頂點(跳過邊): in()
  • 要加載Link類的所有傳入頂點(跳過邊): in('Link')
  • 加載所有傳入邊: inE()
  • 加載類Link所有傳入邊緣: inE('Link')
  • 加載所有傳出頂點(跳過邊): out()
  • 加載Link類的所有傳出頂點(跳過邊): out('Link')
  • 加載所有傳出的邊: outE()
  • 加載類Link所有輸出邊緣: outE('Link')

因此,在您的情況下,您想加載所有頂點及其外邊緣,因此我們執行以下操作:

SELECT name, outE('Link') FROM Node

加載頂點的名稱和指向輸出邊緣的指針:

OrientDB查詢示例

如果您想獲得輸出邊緣的名稱的列表,我們只需執行以下操作:

SELECT name, outE('Link').name FROM Node

這使:

OrientDB查詢2的示例

這正是您在問題中要問的。 如您所見,這在OrientDB中非常簡單,您只需要意識到OrientDB比您想象的要聰明:)

Neo4j中使用的CYPHER語法最終救了我。

start n=node(*) MATCH (n)-[left]->(n2)<-[right]-(n3) WHERE n.type? ='myType' AND left.line > right.line - 1 AND left.line < right.line + 1 RETURN n, left, n2, right, n3

節點n是樞轉元件,就像在路徑內的每個其他步驟一樣,可以提供一個過濾器。 對我來說,根據路徑的其他部分選擇進一步的步驟很重要。

使用OrientDb,我無法找到一種輕松地將屬性彼此關聯的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM