來源:https://docs.janusgraph.org/
一纪隙、JanusGraph的好處
JanusGraph的設計目的是支持處理非常大的圖形,這些圖形需要的存儲和計算能力超出了一臺機器所能提供的能力俺夕。用于實時遍歷和分析查詢的縮放圖數(shù)據(jù)處理是JanusGraph的基本優(yōu)勢。本節(jié)將討論JanusGraph的各種具體好處及其底層的难捌、受支持的持久性解決方案囚聚。
二、一般JanusGraph好處
支持非常大的圖形蓖谢。JanusGraph圖形可以根據(jù)集群中的機器數(shù)量進行縮放捂蕴。
支持非常多的并發(fā)事務和操作圖處理。JanusGraph的事務處理能力隨集群中機器的數(shù)量而變化闪幽,可以在毫秒內(nèi)回答大型圖上的復雜遍歷查詢啥辨。
通過Hadoop框架支持全局圖分析和批處理圖。
支持地理沟使,數(shù)值范圍委可,和全文搜索頂點和邊非常大的圖形。
本機支持Apache TinkerPop公開的流行屬性圖數(shù)據(jù)模型腊嗡。
本機支持圖形遍歷語言Gremlin着倾。
許多圖級配置提供了調(diào)優(yōu)性能的旋鈕。
以vertex為中心的索引提供了vertex級別的查詢燕少,以緩解臭名昭著的超級節(jié)點問題卡者。
提供優(yōu)化的磁盤表示,以便有效地使用存儲和訪問速度客们。
在Apache 2許可下的開放源碼崇决。
三、JanusGraph與Apache Cassandra匹配的好處
連續(xù)可用底挫,沒有單點故障恒傻。
因為沒有主/從架構(gòu),所以對圖沒有讀/寫瓶頸建邓。
彈性可伸縮性允許引入和刪除機器盈厘。
緩存層確保連續(xù)訪問的數(shù)據(jù)在內(nèi)存中可用。
通過向集群添加更多的機器來增加緩存的大小官边。
與Apache Hadoop集成沸手。
在Apache 2許可下的開放源碼。
三注簿、JanusGraph與HBase匹配的好處
與Apache Hadoop生態(tài)系統(tǒng)的緊密集成契吉。
本機支持強一致性。
線性可擴展性诡渴,增加更多的機器捐晶。
嚴格一致的讀寫。
使用HBase表支持Hadoop MapReduce作業(yè)的方便基類。
支持通過JMX導出指標租悄。
在Apache 2許可下的開放源碼谨究。
四、JanusGraph和CAP定理
在使用數(shù)據(jù)庫時泣棋,應該充分考慮CAP定理(C=一致性胶哲,a =可用性,P=可分性)潭辈。JanusGraph有3個支持后端:Apache Cassandra鸯屿、Apache HBase和Oracle Berkeley DB Java Edition。注意把敢,BerkeleyDB JE是一個非分布式數(shù)據(jù)庫寄摆,通常僅用于JanusGraph的測試和探索。
HBase優(yōu)先考慮一致性修赞,而犧牲了收益率婶恼,即完成請求的概率。Cassandra優(yōu)先考慮可用性柏副,而犧牲了收獲勾邦,即查詢答案的完整性(可用數(shù)據(jù)/完整數(shù)據(jù))。
五割择、開始
本節(jié)中的示例廣泛使用了與JanusGraph一起發(fā)布的稱為眾神圖的玩具圖眷篇。此圖如下圖所示。抽象的數(shù)據(jù)模型被稱為屬性圖模型荔泳,這個特殊的例子描述了羅馬萬神殿的存在和地點之間的關系蕉饼。此外,圖中的特殊文本和符號修飾符(例如粗體玛歌、下劃線等)表示圖中的不同示意圖/類型昧港。
六、下載JanusGraph并運行Gremlin控制臺
JanusGraph可以從項目存儲庫的發(fā)布部分下載支子。一旦檢索并解包慨飘,就可以打開Gremlin控制臺。Gremlin控制臺是一個與JanusGraph一起發(fā)布的REPL(即交互式shell)译荞,它與標準Gremlin控制臺的唯一區(qū)別在于,JanusGraph是一個預安裝和預加載的包休弃⊥碳撸或者,用戶可以從中央存儲庫下載JanusGraph包塔猾,選擇在現(xiàn)有的Gremlin控制臺中安裝和激活JanusGraph篙骡。在下面的例子中,使用了janusgraph.zip,但是糯俗,一定要解壓縮下載的zip文件尿褪。
注意:JanusGraph需要Java 8(標準版)。推薦使用Oracle Java 8得湘。JanusGraph的shell腳本期望$JAVA_HOME環(huán)境變量指向安裝JRE或JDK的目錄杖玲。
Gremlin控制臺使用Apache Groovy解釋命令。Groovy是Java的一個超集淘正,它具有各種簡化的表示法摆马,使交互式編程變得更容易。類似地鸿吆,Gremlin-Groovy是Groovy的超集囤采,具有各種簡化圖遍歷的簡寫符號。下面的基本示例演示如何處理數(shù)字惩淳、字符串和映射蕉毯。本教程的其余部分將討論特定于圖的構(gòu)造。
注意:有關使用Gremlin的更多信息思犁,請參閱Apache TinkerPop代虾、SQL2Gremlin和Gremlin菜譜。
七抒倚、加載眾神圖到JanusGraph
下面的示例將打開一個JanusGraph圖形實例褐着,并加載上面所示的眾神數(shù)據(jù)集的圖形。JanusGraphFactory提供了一組靜態(tài)開放方法托呕,每個方法都以一個配置作為參數(shù)并返回一個圖形實例含蓉。本教程在使用BerkeleyDB存儲后端和Elasticsearch索引后端的配置上調(diào)用這些開放方法之一,然后使用幫助類GraphOfTheGodsFactory加載諸神圖项郊。本節(jié)略過配置細節(jié)馅扣,但是關于存儲后端、索引后端及其配置的其他信息可以在存儲后端着降、索引后端和配置參考中找到差油。
在返回新構(gòu)造的圖之前,JanusGraphFactory.open()和GraphOfTheGodsFactory.load()方法執(zhí)行以下操作:
在圖上創(chuàng)建全局和以頂點為中心的索引的集合任洞。
將所有頂點及其屬性添加到圖中蓄喇。
將所有邊及其屬性添加到圖中。
詳情請參閱GraphOfTheGodsFactory源代碼交掏。
對于使用JanusGraph/Cassandra(或JanusGraph/HBase)的用戶妆偏,請確保使用conf/JanusGraph-cql-es.properties(或conf/ JanusGraph - HBase - .properties)和GraphOfTheGodsFactory.load()。
您還可以使用conf/janusgraph-cql.properties盅弛、conf/janusgraph-berkeleyje.properties或conf/janusgraph-hbase.properties配置文件來打開沒有配置后端索引的圖形钱骂。在這種情況下叔锐,您需要使用GraphOfTheGodsFactory.loadWithoutMixedIndex()方法來加載眾神圖,這樣它就不會嘗試使用索引后端见秽。
八愉烙、全局指數(shù)圖
在圖形數(shù)據(jù)庫中訪問數(shù)據(jù)的典型模式是首先使用圖形索引定位到圖中的入口點。該入口點是一個元素(或一組元素)——一個頂點或邊解取。在條目元素中步责,Gremlin路徑描述描述了如何通過顯式圖結(jié)構(gòu)遍歷圖中的其他元素。
假設name屬性上有一個惟一的索引肮蛹,那么可以檢索到Saturn頂點勺择。然后可以檢查屬性圖(即土星的鍵/值對)。正如所證明的伦忠,土星頂點有一個名字“土星”省核,年齡10000,和一個類型的“泰坦”昆码。通過遍歷表示:“誰是土星的孫子?”(“父親”的反義詞是“孩子”)气忠。結(jié)果是大力神。
屬性位置也在圖索引中赋咽。屬性位置是邊屬性旧噪。因此,JanusGraph可以在一個圖索引中對邊進行索引脓匿√灾樱可以查詢在雅典50公里范圍內(nèi)(緯度:37.97和經(jīng)度:23.72)發(fā)生的所有事件的眾神圖。然后陪毡,給定這些信息米母,哪些頂點參與了這些事件。
圖索引是JanusGraph中的一種索引結(jié)構(gòu)毡琉。圖索引由JanusGraph自動選擇铁瞒,以回答要求滿足一個或多個約束(例如has或interval)的所有頂點(g.V)或所有邊(g.E)的問題。JanusGraph索引的第二個方面是以頂點為中心的索引桅滋。以頂點為中心的索引用于加速圖內(nèi)的遍歷慧耍。以頂點為中心的索引將在后面介紹。
九丐谋、圖遍歷的例子
宙斯和阿爾克墨涅之子赫拉克勒斯擁有超人的力量芍碧。大力神是半神,因為他的父親是神号俐,他的母親是人师枣。朱庇特的妻子朱諾對朱庇特的不忠大發(fā)雷霆。為了復仇萧落,她用暫時的精神錯亂蒙蔽了大力神的雙眼践美,導致他殺死了自己的妻子和孩子。為了贖罪找岖,特爾斐的神諭命令赫拉克勒斯為歐律斯透斯服務陨倡。歐律斯透斯任命赫拉克勒斯做12件事。
在前面的章節(jié)中许布,已經(jīng)證明了土星的孫子是大力神兴革。這可以用循環(huán)來表示。在本質(zhì)上蜜唾,大力神是一個頂點杂曲,它離土星有2步遠,沿著“父親”的路徑袁余。
大力神是半神擎勘。要證明赫拉克勒斯是半人半神,就必須考察他父母的出身颖榜。從赫拉克勒斯的頂點到他的父母是可能的棚饵。最后,可以確定它們的類型——產(chǎn)生“神”和“人”掩完。
到目前為止的例子都是關于羅馬萬神殿中不同角色的基因序列噪漾。屬性圖模型具有足夠的表達能力來表示多種類型的事物和關系。通過這種方式且蓬,眾神圖也確定了赫拉克勒斯的各種英雄壯舉——他著名的12項勞作欣硼。在前一節(jié)中,人們發(fā)現(xiàn)大力神卷入了雅典附近的兩場戰(zhàn)役恶阴≌┦ぃ可以通過遍歷大力神頂點的戰(zhàn)斗邊來探索這些事件。
戰(zhàn)斗邊上的邊屬性時間由頂點的中心索引來索引存淫。根據(jù)對時間的約束/過濾器對大力神事件的邊進行排列耘斩,比對所有邊進行線性掃描和過濾(通常為O(log n),其中n為事件邊數(shù))要快桅咆。JanusGraph足夠智能括授,可以在可用時使用以頂點為中心的索引。Gremlin表達式的toString()將分解為各個步驟岩饼。
gremlin>g.V(hercules).outE('battled').has('time',gt(1)).inV().values('name').toString()==>[GraphStep([v[24744]],vertex),VertexStep(OUT,[battled],edge),HasStep([time.gt(1)]),EdgeVertexStep(IN),PropertiesStep([name],value)]
十荚虚、更復雜的圖遍歷示例
冥王星住在塔耳塔斯的深處。他與赫拉克勒斯的關系因為赫拉克勒斯與他的寵物賽布勒斯的爭斗而變得緊張籍茧。然而版述,大力神是他的侄子——他該如何讓大力神為他的傲慢付出代價呢?
下面的Gremlin遍歷提供了關于眾神圖的更多示例。每個遍歷的解釋在前面的行中作為//注釋提供寞冯。
Tartarus的室友
Pluto’s Brothers
最后渴析,冥王星住在塔耳塔魯斯晚伙,因為他對死亡毫不關心。而他的兄弟們俭茧,則是根據(jù)他們對這些地點的某些特性的喜愛來選擇地點的咆疗。
十一、體系結(jié)構(gòu)概述
JanusGraph是一個圖形數(shù)據(jù)庫引擎母债。JanusGraph本身專注于緊湊的圖形序列化午磁、豐富的圖形數(shù)據(jù)建模和高效的查詢執(zhí)行。另外毡们,JanusGraph利用Hadoop進行圖形分析和批處理迅皇。JanusGraph為數(shù)據(jù)持久性、數(shù)據(jù)索引和客戶端訪問實現(xiàn)了健壯的衙熔、模塊化的接口登颓。JanusGraph的模塊化架構(gòu)允許它與廣泛的存儲、索引和客戶端技術進行互操作;它還簡化了擴展JanusGraph以支持新圖形的過程青责。
在JanusGraph和磁盤之間有一個或多個存儲和索引適配器挺据。JanusGraph具有以下適配器的標準,但是JanusGraph的模塊化架構(gòu)支持第三方適配器脖隶。
數(shù)據(jù)存儲:
Oracle Berkeley DB Java Edition
索引扁耐,加快和支持更復雜的查詢:
一般來說,應用程序可以通過兩種方式與JanusGraph交互:
將JanusGraph嵌入到應用程序中产阱,直接針對相同JVM中的圖形執(zhí)行Gremlin查詢婉称。查詢執(zhí)行、JanusGraph的緩存和事務處理都發(fā)生在與應用程序相同的JVM中构蹬,而來自存儲后端的數(shù)據(jù)檢索可能是本地的王暗,也可能是遠程的。
通過向服務器提交Gremlin查詢庄敛,與本地或遠程JanusGraph實例進行交互俗壹。JanusGraph本身支持Apache TinkerPop堆棧的Gremlin服務器組件。