ArangoDB簡單實例介紹


數據介紹:

2008美國國內航班數據

  • airports.csv

  • flights.csv

數據下載地址:https://www.arangodb.com/graphcourse_demodata_arangodb-1/

數據導入:

在終端中輸入以下命令:

arangoimp --file path to airports.csv on your machine --collection airports --create-collection true --type csv

顯示以下結果:

使用網頁UI:

COLLECTIONS

點擊頁面左側按鈕"COLLECTIONS",可以看到之前導入的數據集"airports",圖標樣式表明它是一個文本集合

點擊進入數據集"airports",該頁面包含了對數據集的預覽、篩選、上傳、下載和刪除等操作

QUERIES

該模塊提供了AQL查詢功能

嘗試幾個簡單的查詢

1、返回數據集"airports"中所有的airports:

FOR airport IN airports RETURN airport 

2、只返回California的airports:

FOR airport IN airports FILTER airport.state == "CA" RETURN airport

3、返回每個國家的機場數量

FOR airport IN airports COLLECT state = airport.state WITH COUNT INTO counter RETURN {state, counter}

注意:

在上面的代碼示例中,所有關鍵字COLLECT、WITH和RETURN等都是大寫的,但它只是一個約定。你也可以將所有關鍵詞小寫或混合大小寫。但是變量名、屬性名和集合名是區分大小寫的。

Graph Basics:

上面的例子中,我們使用的數據"airports"可以當做圖的節點,但是為了完善圖,我們還需要數據來作為邊,在這里我們使用''flights"中的數據作為邊。

首先導入"flights.csv"文件

arangoimp --file "/home/data/flights.csv" --collection flights --create-collection true --type csv --create-collection-type edge

得到如下結果表明數據導入成功:

 

the concepts of the query options:


FOR vertex[, edge[, path]]
IN [min[..max]]
OUTBOUND|INBOUND|ANY startVertex
edgeCollection[, more…]

Explanation
FOR 有三個參數
‣ vertex (object): 遍歷中的當前頂點
‣ edge (object, optional): 遍歷中的當前邊
‣ path (object, optional): 兩個對象的路徑表示

  ‣ vertices: 此路徑上所有頂點的數組

  ‣ edges: 此路徑上所有邊的數組

IN min..max: 定義遍歷的最小深度和最大深度。如果未指定,默認為1!

OUTBOUND/INBOUND/ANY :定義搜索的方向

edgeCollection: 保存在遍歷中要考慮的邊緣的集合的一個或多個名稱

OPTIONS options(object,optional):用於修改遍歷的執行。只有以下屬性有效果,所有其他屬性將被忽略:

  uniqueVertices(string):可選地確保頂點唯一性

    “path” - 保證沒有路徑返回一個重復的頂點

    “global” - 保證在遍歷期間每個頂點最多被訪問一次,無論從起始頂點到這個頂點有多少路徑。如果您從最小深度min depth > 1之前發現的頂點開始,可能根本不會返回(它仍然可能是路徑的一部分)。注意: 使用此配置,結果不再是確定性的。如果從startVertex到頂點有多條路徑,則選擇其中一條路徑。

    “none”(默認) - 不對頂點應用唯一性檢查

  uniqueEdges(string):可選地確保邊緣唯一性

    “path”(默認) - 保證沒有路徑返回一個重復的邊

    “global” - 保證在遍歷過程中,每個邊緣最多被訪問一次,無論從起始頂點到該邊緣有多少條路徑。如果從a開始,min depth > 1在最小深度之前發現的邊緣根本不會被返回(它仍然可能是路徑的一部分)。注意: 使用此配置,結果不再是確定性的。如果有從多個路徑startVertex超過邊緣的那些中的一個被拾取。

    “none” - 不對邊緣應用唯一性檢查。注意: 使用此配置,遍歷將跟隨邊沿周期。

  bfs(bool):可選地使用可選的寬度優先遍歷算法

    true - 遍歷將被執行寬度優先。結果將首先包含深度1的所有頂點。比深度2處的所有頂點等等。

    false(默認) - 遍歷將以深度優先執行。它首先將深度1的一個頂點的最小深度的最小深度返回到最大深度。對於深度1處的下一個頂點,依此類推。

圖查詢:

1、返回能到達洛杉磯國際機場(Lax)的所有機場

FOR airport IN OUTBOUND 'airports/LAX' flights RETURN DISTINCT airport

2、返回10個洛杉磯的航班和他們的目的地

FOR airport, flight IN OUTBOUND 'airports/LAX' flights LIMIT 10
    RETURN {airport, flight}

遍歷圖:

對於最小深度大於2的遍歷,有兩個選項可以選擇:

深度優先(默認):繼續沿着從起始頂點到該路徑上的最后頂點的邊緣,或者直到達到最大遍歷深度,然后向下走其他路徑

廣度優先(可選):從開始頂點到下一個級別遵循所有邊緣,然后按另一個級別跟蹤鄰居的所有邊緣,並繼續這個模式,直到沒有更多的邊緣跟隨或達到最大的遍歷深度。 

返回LAX直達的所有機場:

FOR airport IN OUTBOUND 'airports/LAX' flights OPTIONS {bfs: true, uniqueVertices: 'global'} RETURN airport

通過執行時間與之前的查詢進行比較,返回相同的機場:

FOR airport IN OUTBOUND 'airports/LAX' flights RETURN DISTINCT airport

對比這兩次結果,將看到顯著的性能改進。

The LET keyword in AQL

Hands on: Storing Results in Variables

簡單表達式以及整個子查詢的結果可以存儲在變量中。若要聲明變量,請使用LET關鍵字,后面跟着變量名、等號和表達式。如果表達式是子查詢,則代碼必須位於括號中。

在下面的示例中,預先計算出發時間的時間和分鍾,並將其存儲在變量H和M中。

FOR f IN flights FILTER f._from == 'airports/BIS' LIMIT 100 LET h = FLOOR(f.DepTime / 100) LET m = f.DepTime % 100
    RETURN { year: f.Year, month: f.Month, day: f.DayofMonth, time: f.DepTime, iso: DATE_ISO8601(f.Year, f.Month, f.DayofMonth, h, m) }

Shortest_Path

最短路徑查詢在兩個給定文檔之間找到連接,其邊緣數量最少。

尋找機場BIS和JFK之間的最短路徑:

FOR v IN OUTBOUND SHORTEST_PATH 'airports/BIS'
TO 'airports/JFK' flights RETURN v

返回從BIS到JFK的最小航班數:

LET airports = ( FOR v IN OUTBOUND SHORTEST_PATH 'airports/BIS'
    TO 'airports/JFK' flights RETURN v ) RETURN LENGTH(airports) - 1

Pattern Matching

 目標:找出BIS與JFK之間花費時間最短的路徑

STEP1 

篩選BIS到JFK的所有路徑,由於在shortest path中最短路徑深度為2,所以這里直接使用“IN 2 OUTBOUND”

FOR v, e, p IN 2 OUTBOUND 'airports/BIS' flights FILTER v._id == 'airports/JFK' LIMIT 5 RETURN p

STEP2

篩選一天內的路徑,這里以1月1號為例

FOR v, e, p IN 2 OUTBOUND 'airports/BIS' flights FILTER v._id == 'airports/JFK' FILTER p.edges[*].Month ALL == 1 FILTER p.edges[*].DayofMonth ALL == 1 LIMIT 5 RETURN p

STEP3

使用DATE_DIFF() 函數計算出發時間與到達時間的差值,然后將結果升序排列

FOR v, e, p IN 2 OUTBOUND 'airports/BIS' flights FILTER v._id == 'airports/JFK' FILTER p.edges[*].Month ALL == 1 FILTER p.edges[*].DayofMonth ALL == 1 LET flightTime = DATE_DIFF(p.edges[0].DepTimeUTC, p.edges[1].ArrTimeUTC, 'i') SORT flightTime ASC LIMIT 5 RETURN { flight: p, time: flightTime }

  

通過觀察結果,我們發現有些結果是負值。原因是有些路徑中,第一條航線未降落時,第二條就已經起飛,為此需要增加一條限定條件。

FOR v, e, p IN 2 OUTBOUND 'airports/BIS' flights FILTER v._id == 'airports/JFK' FILTER p.edges[*].Month ALL == 1 FILTER p.edges[*].DayofMonth ALL == 1 FILTER DATE_ADD(p.edges[0].ArrTimeUTC, 20, 'minutes') < p.edges[1].DepTimeUTC LET flightTime = DATE_DIFF(p.edges[0].DepTimeUTC, p.edges[1].ArrTimeUTC, 'i') SORT flightTime ASC LIMIT 5 RETURN { flight: p, time: flightTime }

至此,已經得到了用時最短的路徑。

優化:

在這個例子中,我們的查詢需要遍歷非常多的邊,其中有些邊是不需要去遍歷的。我們這里用vertex-centric index方法來優化。

‣ 進入Collection界面
‣ 打開 flights collection
‣ 點擊Indexes 選項
‣ 點擊綠色的+號來添加一個新的索引

‣ 設置 Type 為 Hash Index
‣ 在Fields中填寫 _from,Month,DayofMonth 
‣ 點擊綠色Create 選項生成新索引

重新運行STEP3代碼,會發現運行效率大大提高,點擊Explain選項能夠看到以下信息:

原理解釋:

如果沒有以頂點為中心的索引,則需要跟蹤出發機場的所有外出邊緣,然后檢查它們是否滿足我們的條件(在某一天,到達期望的目的地,具有可行的中轉)。

我們創建的新索引允許在某一天(Month,DayofMonth屬性)內快速查找離開機場的外部邊緣(_from屬性),這消除了在不同天提取和過濾所有邊緣的需要。它減少了需要用原始索引檢查邊緣的數量,並節省了相當長的時間。

 參考資料:

https://www.arangodb.com/documentation/

歡迎轉載,轉載請注明網址:https://www.cnblogs.com/minglex/p/9383849.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM