1.Overall Comparison
Name |
Neo4j |
JanusGraph |
Giraph |
1.Compute Framework |
Yes |
Yes |
Yes |
2.External Components Demand |
Option |
Yes |
Yes |
3.Algorithm Support |
Official/Spark/ Mazerunner/ XData |
Spark/Giraph/HDP/ XData |
XData |
4.HF Subgraph Mining |
Yes (On Sparser Data)(Memory limit) |
Yes |
Yes |
SparQL Support |
Yes |
No |
No |
Gremlin Support |
Yes |
Yes |
No |
Cypher Support |
Yes |
No |
No |
Relation Inference |
Supported base on multi-thread single link query and thread d3-format result merge |
2.Detail
2.1 Compute Framework
組件名 |
Neo4j |
JanusGraph |
Giraph |
URL |
|||
計算框架概述 |
使用spark連接器,可以使用SparkSQL、Streaming、GraphX框架進行計算。 使用Mazerunner組件,允許將專用數據集(例如節點或關系列表)導出到Spark。
|
OLAP Traversals引擎可以選用Gremlin Graph Computer,默認安裝Gephi、Giraph、TinkerGraph、Hadoop、Spark等大數據平台插件,或使用ManagementApi、GremlinApi。 |
Giraph基於Hadoop而建,將MapReduce中Mapper進行封裝,未使用reducer。在Mapper中進行多次迭代,每次迭代等價於BSP模型中的SuperStep。一個Hadoop Job等價於一次BSP作業。 |
2.2 External Components Demand
組件名 |
Neo4j |
JanusGraph |
Giraph |
URL |
|||
額外組件依賴 |
官方提供組件,可以與ES、MongoDB、Cassandra等NoSqlDb進行交互 |
計算框架可以選用Gephi、Giraph、TinkerGraph、Hadoop、Spark框架。 數據存儲服務可以選用Cassandra、HBase或Berkeley DB服務。 數據索引可以選用Es、Solr或Lucene服務。 |
Giraph基於Hadoop而建,依賴Hadoop、Hive。 |
2.3 Algorithm Support
組件名 |
Neo4j |
JanusGraph |
Giraph |
URL |
http://tinkerpop.apache.org/docs/3.2.4/reference/#_a_collection_of_vertexprograms |
||
算法支持 |
官方: 中心性算法:Pag`eRank、ArticleRank、中介中心性、接近中心性、調和中心性等算法。 社區檢測算法:Louvain、LPA 標簽傳播、連通元件與強連通元件、三角形計數、聚類系數等算法。 路徑探尋算法:最小權重生成樹、最短路徑、單源最短路徑、All Pairs最短路徑、A *法、(YenK)K最短路徑、隨機漫步等算法。 相似度算法:傑卡德相似度、余弦相似度、歐幾里得距離、重疊相似度等算法。 |
官方: PageRankVertexProgram、PeerPressureVertexProgram 其他實現(Sotera): |
官方: 最短路徑、出/入度計數、PageRank、連通元件算法。 其他實現(Sotera):
|
2.4 HF Subgraph Mining
組件名 |
Neo4j |
JanusGraph |
Giraph |
URL |
https://www.slideshare.net/ptgoetz/large-scale-graph-analytics-with-janusgraph |
https://code.fb.com/core-data/scaling-apache-giraph-to-a-trillion-edges/ |
|
高頻子圖挖掘 |
節點數量受單機內存容量影響,最大連接數受Bolt線程池配置影響,在小數據集或稀疏數據集下性能表現良好,可以實現高頻訪問。 OLAP使用spark-connector通過大數據平台Apache Spark集群實現,擁有橫向擴展的計算能力。 |
JanusGraph通過與大數據平台(Apache Spark,Apache Giraph,Apache Hadoop)的集成支持全局圖形數據分析,報告和ETL 。 擁有橫向擴展的計算能力,可進行計算密集型子圖挖掘。 |
Giraph應用程序作為單個MapReduce作業運行,因此可以通過增加作業的工作者(Mapper節點)數量來輕松並行化。 擁有橫向擴展的計算能力,可進行計算密集型子圖挖掘。 |
3.JanusGraph Detail
3.1 Basic Pattern
JanusGraph本身就是一組沒有執行線程的jar文件。連接和使用JanusGraph數據庫有兩種基本模式(JanusGraph Embedded、JanusGraph Server)和交互式Shell(Gremlin Console)方式:
模式 |
描述 |
Gremlin Console |
Gremlin控制台是一個REPL(即交互式shell),與JanusGraph一起打包,可以通過控制台進行JanusGraph 圖庫的創建(連接)、查詢等操作。 |
JanusGraph Embedded |
嵌入式查詢,JanusGraph 作為應用程序的一部分,執行Gremlin,查詢同一JVM中的圖庫。 查詢執行、JanusGraph緩存和事務處理均發生於此JVM。 存儲后端,即查詢結果的數據來源庫,可能是本地庫或遠程庫。 |
JanusGraph Server |
機器上長期運行的服務器進程,允許遠程客戶端或運行在程序中的邏輯進行JanusGraph調用。 提交Gremlin查詢到服務器,與JanusGraph實例交互。 |
3.2 Configuration Each Pattern
不同模式下配置加載示例:
模式 |
配置加載 |
Gremlin Console |
通過加載配置文件路徑 graph = JanusGraphFactory.open ('path / to / configuration.properties' ) |
JanusGraph Embedded |
通過加載”后端存儲名:配置文件地址或主機名” graph = JanusGraphFactory.open('cql:localhost') graph = JanusGraphFactory.open ('berkeleyje:/ tmp / graph' ) |
JanusGraph Server |
... graphs: { graph: conf/janusgraph-berkeleyje.properties } scriptEngines: { gremlin-groovy: { plugins: { org.janusgraph.graphdb.tinkerpop.plugin.JanusGraphGremlinPlugin: {}, org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {}, ... |
3.3 Classification Of Configuration
JanusGraph區分本地和全局配置選項,具體區分了以下五個配置選項范圍:
配置類型 |
作用域 |
修改指南 |
LOCAL(本地配置) |
單個JanusGraph實例 |
初始化實例時提供 |
MASKABLE(可屏蔽配置) |
集群中的某個JanusGraph實例 |
本地配置文件提供則覆蓋配置,若無本地配置文件則讀取集群的全局配置 |
GLOBAL(全局配置) |
集群中的所有JanusGraph實例 |
由全局配置提供,且無法在某實例上覆蓋配置 |
GLOBAL_OFFLINE(離線全局配置) |
集群中的所有JanusGraph實例 |
類似GLOBAL配置,但修改需要重啟集群: 2:關閉所有運行中的事務且無新事務提交 3:通過ManagementAPI修改配置,並commit 4:重啟所有節點 |
FIXED(固定配置) |
集群中的所有JanusGraph實例 |
由集群初始化是提供,且無法修改 |
3.4 Data Loading Process
后端存儲中,數據被加載到JanusGraph的過程
過程描述 |
對圖創建全局和以節點為中心的索引 |
加載所有節點 |
加載所有邊 |
3.5 Storage Backend Comparison
不同后端存儲架構、優點以及業務選用邏輯。
組件 |
架構 |
限制 |
優點 |
選用邏輯 |
Oracle Berkeley DB Java版 |
單機節點,同個JVM。 |
最大一億節點限制; 整庫遍歷操作易耗盡內存; 受單點故障影響; |
得益於處於同JVM,對於中小規模圖庫的訪問,Berkeley DB具有比分布式存儲更快速度。 |
測試和探索邏輯時選用。 對中小圖庫保證可用性和一致性。 無分布式架構。 |
Cassandra |
分布式架構 |
- |
高可用,無單點故障; 彈性擴展,可以動態增加或減少節點。 |
優先考慮可用性和可擴展性,在一致性上有所妥協,即查詢結果的完整性(可用數據/所有數據)。 |
HBase |
分布式架構 |
- |
Hadoop生態系統緊密集成; 強一致性讀寫模型; 可擴展更多機器; |
優先考慮一致性與分布性,並在可用性部分進行妥協,即響應請求的概率(查詢結果數/查詢總數)。 |
3.6 Schema and Data Model
每個JanusGraph圖庫都有一個由邊標簽、屬性鍵和用到的頂點標簽組成的模式。JanusGraph模式可以被顯式或隱式地指定,官方建議明確指定模式,模式可以隨着系統發展而作出調整,並對性能進行調優。
3.6.1 Defining Edge Labels
可以通過在graph(或management transaction)對象上調用makeEdgeLabel(String labelName)方法,得到一個builder,之后通過builder定義邊的多重性,邊的多重性有以下設置選項:
多重性 |
描述 |
MULTI |
任意一對頂點,允許存在任意多個當前標簽類型的邊 |
SIMPLE |
任意一對頂點,最多允許存在一條當前標簽類型的邊 |
MANY2ONE |
任何頂點,最多允許一條當前類型出射邊和任意多條當前類型入射邊 |
ONE2MANY |
任何頂點,最多允許一條當前類型入射邊和任意多條當前類型出射邊 |
ONE2ONE |
任何頂點,最多允許一條當前類型入射邊和最多一條當前類型出射邊 |
示例:(若不指定多重性則默認為MULTI)
mgmt = graph.openManagement()
follow = mgmt.makeEdgeLabel('follow').multiplicity(MULTI).make()
mother = mgmt.makeEdgeLabel('mother').multiplicity(MANY2ONE).make()
mgmt.commit()
3.6.2 Defining Property Keys
邊或頂點上的屬性是鍵值對,屬性鍵是Schema的一部分,並且可以限制屬性類型和值的基數。可以通過在graph(或management transaction)對象上調用makePropertyKey(String propertyName)方法,得到屬性鍵的builder,之后通過builder. datatype(Class)指定屬性鍵的數據類型。JanusGraph會強制所有與屬性鍵關聯的值擁有數據類型配置,以此保證圖數據的有效性。
數據類型
- 數據類型Object.class,可以允許任何(可序列化)值與鍵關聯。官方建議盡可能使用具體的數據類型。配置的類型必須是具體的類,而不是接口或抽象類。
- JanusGraph會考慮類相等性,因此不允許添加已配置類型的子類。
JanusGraph原生支持的數據類型
類型 |
描述 |
String |
字符數組 |
Character |
單個字符 |
Boolean |
true or false |
Byte |
字節值 |
Short |
短整型 |
Integer |
整型 |
Long |
長整型 |
Float |
4字節單精度浮點數 |
Double |
8字節雙精度浮點數 |
Date |
java.util.Date |
Geoshape |
地理學形狀:點、圓、方形 |
UUID |
java.util.UUID |
屬性鍵基數
使用cardinality(cardinality),在任意指定節點上,定義與鍵關聯的值基數,以下是基數可選項:
名稱 |
描述 |
SINGLE (default) |
對於每個元素,當前鍵最多允許一個值 |
LIST |
對於每個元素,當前鍵允許任意個值 |
SET |
對於每個元素,當前鍵允許任意個非重復值 |
默認基數項為SINGLE,故所有邊的基數均為SINGLE,所以向邊上的某個鍵附加多個值是不允許的。
示例:
mgmt = graph.openManagement()
birthDate = mgmt.makePropertyKey('birthDate').dataType(Long.class).cardinality(Cardinality.SINGLE).make()
name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.SET).make()
sensorReading = mgmt.makePropertyKey('sensorReading').dataType(Double.class).cardinality(Cardinality.LIST).make()
mgmt.commit()
3.6.3 Relation Type
邊的標簽和屬性鍵一同被引用作為關系類型,JanusGraph API中有一些方法可以查詢是否存在或檢索包含屬性鍵和邊標簽的關系類型。
示例:
mgmt = graph.openManagement()
if (mgmt.containsRelationType('name'))
name = mgmt.getPropertyKey('name')
mgmt.getRelationTypes(EdgeLabel.class)
mgmt.commit()
3.6.4 Defining Vertex Labels
類似於邊,頂點也有標簽,但頂點標簽是可選的。標簽有助於區分不同的頂點類型,雖然頂點標簽在概念和數據模型