1.Overall Comparison
Name | Neo4j | JanusGraph | Giraph | Jena |
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 | https://neo4j.com/developer/apache-spark/ | https://docs.janusgraph.org/latest/hadoop-tp3.html | https://zh.wikipedia.org/wiki/Giraph |
計算架構概述 | 使用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 | https://neo4j.com/developer/integration/ | https://docs.janusgraph.org/latest/arch-overview.html | https://zh.wikipedia.org/wiki/Giraph |
額外元件依賴 | 官方提供元件,可以與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 | https://github.com/neo4j-contrib/neo4j-graph-algorithms | http://tinkerpop.apache.org/docs/3.2.4/reference/#_a_collection_of_vertexprograms | http://sotera.github.io/distributed-graph-analytics/ |
算法支援 | 官方: 中心性算法:Pag`eRank、ArticleRank、中介中心性、接近中心性、調和中心性等算法。 社群檢測算法:Louvain、LPA 标簽傳播、連通元件與強連通元件、三角形計數、聚類系數等算法。 路徑探尋算法:最小權重生成樹、最短路徑、單源最短路徑、All Pairs最短路徑、A *法、(YenK)K最短路徑、随機漫步等算法。 相似度算法:傑卡德相似度、餘弦相似度、歐幾裡得距離、重疊相似度等算法。 | 官方: PageRankVertexProgram、PeerPressureVertexProgram 其他實作(Sotera): Louvain Modularity、弱連接配接原件、高中介集提取、葉壓縮算法、Page Rank、鄰域算法。 | 官方: 最短路徑、出/入度計數、PageRank、連通元件算法。 其他實作(Sotera): Louvain、弱連接配接原件、高中介集提取、葉壓縮算法、Page Rank。 |
2.4 HF Subgraph Mining
元件名 | Neo4j | JanusGraph | Giraph |
URL | https://www.slideshare.net/nishantgandhi99/neo4j-vs-giraph | 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執行個體互動。 JanusGraph原生支援Apache TinkerPop的Gremlin Server。 |
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配置,但修改需要重新開機叢集: 1:關閉叢集,保留一個運作節點 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生态系統緊密內建; 強一緻性讀寫模型; 可擴充更多機器; 便于支援Hbase的MR任務的基類。 | 優先考慮一緻性與分布性,并在可用性部分進行妥協,即響應請求的機率(查詢結果數/查詢總數)。 |
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
類似于邊,頂點也有标簽,但頂點标簽是可選的。标簽有助于區分不同的頂點類型,雖然頂點标簽在概念和資料模型
4.Jena SparQL Framework
//TODO
5.Grammar example
5.1 Cypher
MATCH (start)-[:father]->()-[:father]->(end) WHERE start.name= "hercules" RETURN end.name
5.2 Gremlin:
g.V().has('name','hercules').out('father').out('father').values('name')
5.3 SparQL:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
FROM <http://example.com/dataset.rdf>
WHERE {
?x foaf:name ?name .
}
ORDER BY ?name
---恢複内容結束---