ArangoDB簡單實例介紹

數據介紹:

2008美國國內航班數據html

  • 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",圖標樣式代表它是一個文本集合url

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

QUERIES

該模塊提供了AQL查詢功能.net

嘗試幾個簡單的查詢3d

一、返回數據集"airports"中全部的airports:

FOR airport IN airports RETURN airport 

二、只返回California的airports:

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

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

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處的下一個頂點,依此類推。

圖查詢:

一、返回能到達洛杉磯國際機場(Lax)的全部機場

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

二、返回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 
相關文章
相關標籤/搜索