ArangoDB避坑
- 2021 年 4 月 19 日
- AI
最近因為項目需要,不得不上手ArangoDB來做一些圖譜類的構建工作,總的來說,ArangoDB的圖構建入門非常的簡單,除了AQL的語法和cyphter有一些差距之外,圖的構建,節點和邊的分開存放,以及僅支援從文件import的graph data等方面來看,基本上和neo4j沒有太大區別。
用完之後感覺,還是neo4j比較香,對於我這樣僅使用工具進行分析的人來說,速度不是慢到離譜的話其實都可以接受,最不能接受的就是:
1、可視化功能差;
2、圖演算法組件嚴重不足
這是個人在選擇graph database的時候最看重的兩點,一方面根據以往的經驗,通過可視化的方式可以非常直觀的了解不同類型節點的網路行為模式,從而人工分析和總結出一些特定的行為規律,然後再對症下藥,使用適當的圖演算法,將這些抽象的行為規律進行量化,從而更好的挖掘出特定的節點。那麼這方面就需要保證開箱即用的圖演算法的豐富性了。
ArangoDB相對於neo4j的缺點如上,可視化功能差強人意,圖演算法組件很缺,而優點,在我來看:
1、據說速度很快,因為neo4j我是在單機上使用的開源社區版,而arangodb則是在集群上使用的,所以速度上不是很好比較,只不過看了一些評估的方法說是arangodb更快balabala;
2、UI介面簡單方便乾淨無比,neo4j 4.X版本引入了bloom和其它的一些組件之後,介面功能,要素太多,看起來略雜亂無章;
3、關於開源的問題,實際上arangodb中高級的smartgraph功能也是只有企業版能夠提供的,只不過相對於neo4j來說,開源的arangodb支援分散式部署;
前置知識:
arangodb是一個多模式資料庫,可以存放文檔,key-value pair和圖數據,它將三者的存儲進行了統一使得通過一套api來進行操作。

和hadoop類似,arangodb生態圈也有很多的功能組鍵,

就分析而言,主要使用web interface進行可視化,使用shell進行命令行介面的圖計算(這也是arangodb不方便的一點,圖計算無法實時返回,必須先計算結果,保存,然後再可視化,略麻煩)

核心部分,collections永遠存放數據,所有的節點、邊、文本數據等均存在在collectios中,以json的形式保存:
[
{ “_key”: “key1”, … },
{ “_key”: “key2”, … },
…
]
大概是這樣的。
坑1:
目前,arangodb的graph data的導入有兩種方式:
1、類似於neo4j-import,我們需要在arangodbsh,即arangodb的shell介面執行arangoimp 來導入圖數據,arangodb是支援csv、tsv和json格式的文件進行import的。
//www.arangodb.com/docs/stable/programs-arangoimport-examples-csv.html
導入命令大概是這樣的:
arangoimport --file-path-to-airports.csv on your machine
--collection airports --create-collection true --type csv
–file-path-to-airports.csv on your machine表示導入節點文件,除了csv,也可以支援tsv,txt此時也可以支援,設置sep參數就可以。

這裡,如果原始airports節點文件中沒有設定_key和_id,則導入的過程中會自動設定,_key是唯一性標識符和索引,id就是上傳後對應的collection的名字加上 key。
這裡需要注意,建議是自己在csv文件里加入_key,(_id會根據你導入的collection的名字而自動生成),因為我們後面導入edges的時候需要通過 _id來進行edge兩端節點的定位:

這意味著edges對應的csv要根據nodes的csv的 _key和import的collection,就是最終對應的 _id 來確定 _from和_to這兩個欄位的值,所以最好在導入的時候,文件層面處理好,無論是hive還是pyspark,構建一個唯一性標識符都是很簡單的,更簡單的,我們可以直接用節點名的字元串作為_key。
其它的欄位都是節點屬性,和neo4j基本上一樣的。
導入節點和節點屬性之後,大概長這樣:

注意,所有的數據都是保存在collections里的,views是視圖功能,和sql中的視圖功能類似。帶”_”符號的欄位arangodb認為是內置屬性,因此在content中並不顯示。
接下來就準備導入edges的csv文件了。
arangoimport --file path to flights.csv on your machine
--collection flights --create-collection true --type csv
--create-collection-type edge
導入命令基本類似,只不過需要額外指定導入的edges.csv的 collection-type是一個edge,如果是node則不需要指定,默認是 collection-document(就type和document兩種collection類型)
我們的edges.csv要處理成這樣,


根據這個圖我們可以知道,edges.csv的 _from和 _to 屬性要和節點文件中的_id對應起來,而edges的id 是自動生成的,edges的key和id在做單邊圖的時候自動化生成就可以不用考慮太多,主要是from和to這兩個內置屬性要提前設置好存放到csv里,因此我們需要先導入節點數據,然後根據節點數據的id來定義 edges的from和to的取值是怎麼樣的。
2、除此之外,如果edges和nodes的數據量不大,可以直接在web interface中上傳格式對應的json文件,注意文件格式格式格式,這個是最容易錯的,也就是id和from,to,key這些的對應關係要搞清楚,搞清楚了,用起來不要太白痴。
最後,我們通過

這裡的graph部分,按照api的要求添加節點和邊的collection就可以構建出圖來了。
剩下的部分就是AQL查詢了。
AQL的語法非常簡單,看下官網的教程半天就能上手寫邏輯了。
很可惜的是,AQL目前官方僅僅給了部分路徑搜索演算法的demo,而中心性演算法和社區發現演算法需要到arangosh的命令行下調用prgel的圖計算框架來實現(關鍵還不全。。。。)相對於neo4j實現的開箱即用的圖演算法來說少太多了。。。