1: 本地存儲方式
2: 內置查詢語言分析
3: 性能分析
4: 圖算法支持javascript
neo4j數據庫支持最大多少個節點?最大支持多少條邊?html
在數據庫中,讀/寫性能跟節點/邊的數量有關嗎?java
是否有備份恢復機制?node
寫數據庫是線程安全的嗎?python
node,relationship,property存儲都是固定大小的。 以下圖:算法
存儲文件neostore.nodestore.db
,sql
這些指向的ID都是鏈式ID中的第一個,好比關係ID是關係鏈中的第一個。docker
存儲文件neostore.relationshipstore.db
數據庫
關係是雙向鏈表,屬性是單向鏈表ubuntu
存儲文件neostore.propertystore.db
neostore.propertystore.db.index
的指針
查詢時,算法複雜度,$O(n)$,$n$是節點數,其餘常規索引的複雜度都是$O(n log n)$
刪除修改一個有不少不少邊的節點時會有點麻煩,由於沒有常規索引,只能從關係鏈中開始刪除。
文檔在ArangoDB中的存儲格式很是相似JSON,叫作VelocyPack
格式的二進制格式存儲。
_from
和_to
,這兩個屬性被用來建立在文檔和文檔之間建立關係存儲空間佔用下:採用了元數據模式存儲數據
索引類型
Primary Index
,默認索引,創建字段是_key
或_id
上,一個哈希索引Edge Index
,默認索引,創建在_from
、_to
上,哈希索引;不能用於範圍查詢、排序,弱於OrientDBHash Index
,自建Skiplist Index
,有序索引,
Primary Index
和Edge Index
,是內存索引,文檔加載速度很慢,推測是在重建索引。沒有見到ArangoDB說有內存索引持久化。
Persistent Index
,RocksDB
的索引。
Geo Index
,用戶能夠在集合中的一個或多個屬性上建立其餘地理索引。地理索引用於快速找到地球表面的地方。Fulltext Index
,全文索引Hash查詢很快,幾乎爲$O(1)$。
把全部的邊都存儲在一個大哈希表中,把每一個頂點V都放到一個雙鏈表中。
key
查找的,確認邊是否是節點的鏈表中的第一個,不是就經過鏈表繼續找。在ArangoDB 3.0 這個版本,arangodb切換了本身的存儲引擎,RocksDB
。
Persistent indexes via RocksDB is the first step of ArangoDB to persist indexes in general.
在docker下這個版本的ArangoDB的接口沒有作好,掛在存儲卷時會致使RocksDB IO異常。
架構變更很頻繁。3.2版本還會引入pregel框架。
在 Java中,若是哈希函數不合理,返回值過於集中,會致使大字典更慢。Java 因爲存在鏈表和紅黑樹互換機制,搜索時間呈對數級增加,而非線性增加。在理想的哈希函數下,不管字典多大,搜索速度都是同樣快。
SB-Tree Index
CONTAINSTEXT
操做符在查詢中使用它們。Lucene Engine
SB索引,B樹上優化了數據插入和範圍查詢,時間複雜度$O(log(N))$,其底數大約500。
使用相似繼承的方式去實現包含特殊屬性的頂點集和邊集。
OrientDB本地存儲原則:使用包含由固定大小部分(頁面)分割的磁盤數據並寫入日誌記錄方法的磁盤緩存(當頁面中的更改首先記錄在所謂的持久存儲器中時),咱們能夠實現如下特性:OrientDB 2.2.x——PLocal Engine
保護數據
集羣實現就是經過Class的相似繼承機制實現的分表。Clusters
arangod
與arangosh
是用CPP寫的。
但,arangod
與arangosh
依賴V8 JS引擎
arangosh
都會被V8執行。arangod
JS孤島,--javascript.v8-contexts
,在多線程中用JS,可是JS自己仍是單線程的。類SQL語言,與ES6無縫鏈接,可使用ES6語法。
arangosh
使用V8的目的是經過異步回掉調用本地cpp代碼提供計算性能,而不是使用V8去直接計算,因此在用各圖數據庫實現圖算法的時候若是使用JS去實現的話,性能會不是那麼的友善,對於ArangoDB值得期待的就是pregel
將會在3.2版本面世。語義清晰,Neo4J惟一支持的語言
類SQL,語法和SQL基本相似,冗長。
省
arangoimp
插入效率感人,推測緣由:
Persistent Index
這個索引是存儲在磁盤上的,其餘索引是須要在文檔加載時候從新創建索引的。
arangoimp
在默認狀況下到達1300萬數據以後導入性能不好。
在都沒有支持複雜圖算法的狀況下,十萬級數據ArangoDB的圖計算效率比較低,由於是單線程JS在V8上運行的。
arangodb對於邊的插入不支持批量插入:
arangosh
中已經驗證,其只能一條邊一條邊的插入,後面的數據會被無視掉。arangoimp
上存在無效參數:
neo4j-import
導入數據很快。
root@ubuntu:/var/lib/neo4j/data/databases# neo4j-import --into njaq --nodes /home/dawn/csv/perosnInfo.csv --relationships /home/dawn/csv/know.csv --skip-bad-relationships true --skip-bad-entries-logging true --bad-tolerance true
WARNING: neo4j-import is deprecated and support for it will be removed in a future
version of Neo4j; please use neo4j-admin import instead.
Neo4j version: 3.2.1
Importing the contents of these files into njaq:
Nodes:
/home/dawn/csv/perosnInfo.csv
Relationships:
/home/dawn/csv/know.csv
Available resources:
Total machine memory: 3.84 GB
Free machine memory: 1.61 GB
Max heap memory : 875.00 MB
Processors: 4
Configured max memory: 700.35 MB
Nodes, started 2017-06-08 05:35:30.741+0000
[>:18.87 MB|NODE:152.59 MB----|*PROPERTIES(3)============|LABEL SCAN--|v:37.14 MB/s-----------]20.0M ∆21.8K
Done in 51s 548ms
Prepare node index, started 2017-06-08 05:36:22.495+0000
[*DETECT:419.62 MB----------------------------------------------------------------------------]20.0M ∆-6500000
Done in 9s 126ms
Relationships, started 2017-06-08 05:36:31.678+0000
[>:7|T|*PREPARE(4)=========================================================|RE|CALCULATE-|P|v:]79.9M ∆10.9K
Done in 4m 17s 742ms
Relationship --> Relationship 1/1, started 2017-06-08 05:40:49.548+0000
[*>-----------------------------------------------------------------------|LINK------------|v:]79.9M ∆ 405K
Done in 2m 5s 784ms
RelationshipGroup 1/1, started 2017-06-08 05:42:55.404+0000
[*>:??----------------------------------------------------------------------------------------] 0 ∆ 0
Done in 11ms
Node --> Relationship, started 2017-06-08 05:42:55.439+0000
[>:13|*>-------------------------------------------------|LIN|v:26.00 MB/s--------------------]19.9M ∆2.18M Done in 11s 833ms Relationship <-- Relationship 1/1, started 2017-06-08 05:43:07.308+0000 [*>-------------------------------------------------------------------------------|LINK----|v:]79.9M ∆ 168K Done in 11m 29s 787ms Count groups, started 2017-06-08 05:54:37.570+0000 [*>:??----------------------------------------------------------------------------------------] 0 ∆ 0 Done in 1ms Gather, started 2017-06-08 05:54:38.061+0000 [*>:??----------------------------------------------------------------------------------------] 0 ∆ 0 Done in 4ms Write, started 2017-06-08 05:54:38.156+0000 [*>:??----------------------------------------------------------------------------------------] 0 ∆ 0 Done in 15ms Node --> Group, started 2017-06-08 05:54:38.213+0000 [*>:??----------------------------------------------------------------------------------------] 0 ∆ 0 Done in Node counts, started 2017-06-08 05:54:38.264+0000 [*>(4)====================================================================================|COU]20.0M ∆80.0K
Done in 1m 26s 338ms
Relationship counts, started 2017-06-08 05:56:04.625+0000
[*>(4)======================================================|COUNT----------------------------]80.0M ∆1.81M Done in 2m 47s 277ms IMPORT DONE in 23m 22s 420ms. Imported: 20000000 nodes 79994052 relationships 80000000 properties Peak memory usage: 899.62 MB
Neo4J使用導入方法以後會創建索引,不然基本沒有性能,創建索引很快。
@arangodb/pregel
文件夾下,不少分佈式的圖算法JS擴展
對於普通的遍歷最短路徑算法支持和ArangoDB同樣都支持,但Neo4J的圖的遍歷深度的閾值設置比較難,且深度超過6算法會效率比較低。
相比之下,ArangoDB的算法參數設置所有依賴於Key-Value實現,算法在編碼層次靈活性很高。
對於PageRank,CC等算法的實現,Neo4J提供兩種方式:
同上,圖算法也支持Jar包導入。
Cypher:
match (p1:person{no:'%s'}),(p2:person{no:'%s'}) match p=shortestPath((p1)-[*..3]->(p2)) return p
OrientDB SQL:
select dijkstra((select @RID from persons where no='%s'),(select @RID from persons where no='%s'),'E')
AQL:
for v,e in outbound shortest_path '%s' to '%s' graph 'graphPersons' return [v._key,e._key]
Cypher:
MATCH (js:person)-[:know]-(surfer) WHERE js.no = '%s' return surfer
OrientDB SQL:
select from E where out = (select @RID from persons where no='%s
AQL:
traversal_results = graphPersons.traverse(
start_vertex='persons/'+getSingleInfo(id).no,
strategy='bfs',
direction='outbound',
edge_uniqueness='global',
vertex_uniqueness='global',
max_depth=1
)