最近這段時間一直在搞知識圖譜的一個項目,有點忙,是以部落格更新有點慢,現在第一階段的開發基本完活,後面有空會總結幾篇與neo4j有關的文章。
有關neo4j的介紹和使用場景,這裡不多說了,不了解的朋友可以參考我之前的文章 http://qindongliang.iteye.com/blog/2327919
我們的使用場景是用來存知識圖譜有關的資料簡單說就是會把從國小到高中所有的科目的裡面的知識點給存儲起來,讓後建立知識點與知識點之間的依賴關系,進而最終會形成一張複雜的知識網絡。舉個例子:
比如某個學生,要學習化學裡面的某個知識點,但是這個知識點可能與實體有聯系,也可能這個知識點與數學也有聯系,想要學習和掌握這個知識點,他應該怎麼做呢?有了知識圖譜網絡,就能幫他快速的提供一些有用的資訊:
(1)告訴他先學習那幾個知識點
(2)告訴他這個知識點有幾種途徑
(3)告訴他最快的掌握方式是什麼
(4)如果掌握了,通過知識點與題目的關聯,能給他出一些起到練習鞏固的效果
(5)其他....
當然有了圖譜資料之後,其實能從裡面挖掘出很多其他的資訊,當然需要跟具體的業務結合,才能産生的真正的價值。比如北京市的公交站地圖或者地鐵地圖。
言歸正傳,做項目期間大緻看了一遍neo4j官網的文檔和它提供的查詢語言cypher(英文為翻譯的意思)
什麼是Cypher?
cypher是neo4j官網的提供的聲明式圖譜查詢語言,用來可視化查詢展示圖譜裡面的節點和關系,圍繞圖譜查詢提供了可讀性好和容易使用,功能強大的衆多優點。
按照官網的說法,cypher的産生,參考了動态程式設計語言的一些文法,如Python,ruby,Scala,有非常多的強大的函數庫,我們也項目裡也用了一些複雜的文法,确實非常強大,不過想要運用自如,确實得花一定時間測試使用才行。
下面介紹下neo4j的幾個核心概念:
(1) Nodes(節點,類似地鐵圖裡的一個地鐵站)
圖譜的基本機關主要是節點和關系,他們都可以包含屬性,一個節點就是一行資料,一個關系也是一行資料,裡面的屬性就是資料庫裡面的row裡面的字段。
除了屬性之外,關系和節點還可以有零到多個标簽,标簽也可以認為是一個特殊分組方式。
(2) Relationships(關系,類似兩個相鄰地鐵站之間路線)
關系的功能是組織和連接配接節點,一個關系連接配接2個節點,一個開始節點和一個結束節點。當所有的點被連接配接起來,就形成了一張圖譜,通過關系可以組織節點形成任意的結構,比如list,tree,map,tuple,或者更複雜的結構。關系擁有方向進和出,代表一種指向。
(3) Properties(屬性,類似地鐵站的名字,位置,大小,進出口數量等)
屬性非常類似資料庫裡面的字段,隻有節點和關系可以擁有0到多個屬性,屬性類型基本和Java的資料類型一緻,分為 數值,字元串,布爾,以及其他的一些類型,字段名必須是字元串。
(4) Labels(标簽,類似地鐵站的屬于哪個區)
标簽通過形容一種角色或者給節點加上一種類型,一個節點可以有多個類型,通過類型區分一類節點,這樣在查詢時候可以更加友善和高效,除此之外标簽在給屬性建立索引或者限制時候也會用到。label名稱必須是非空的unicode字元串,另外lables最大标記容量是int的最大值,近似21億。
(5) Traversal(周遊,類似我們看地圖找路徑)
查詢時候通常是周遊圖譜然後找到路徑,在周遊時通常會有一個開始節點,然後根據cpyher提供的查詢語句,周遊相關路徑上的節點和關系,進而得到最終的結果。
(6) Paths(路徑,類似從一個地鐵站到另一個地鐵站的所有的到達路徑)
路徑是一個或多個節點通過關系連接配接起來的産物,例如得到圖譜查詢或者周遊的結果。
(7) Schema(模式,類似存儲資料的結構)
neo4j是一個無模式或者less模式的圖譜資料庫,像mongodb,solr,lucene或者es一樣,你可以使用它不需要定義任何schema,
Indexes(索引)
周遊圖通過需要大量的随機讀寫,如果沒有索引,則可能意味着每次都是全圖掃描,這樣效率非常低下,為了獲得更好的性能,我們可以在字段屬性上建構索引,這樣任何查詢操作都會使用索引,進而大幅度提升seek性能,
建構索引是一個異步請求,并不會立刻生效,會再背景建立直至成功後,才能最終生效。如果建立失敗,可以重建索引,先删除索引,在建立即可,然後從log裡面找出建立失敗的原因然後分析。
Constraints(限制)
限制可以定義在某個字段上,限制字段值唯一,建立限制會自動建立索引。
至此對neo4j裡面的核心概念已經介紹完畢,其實就是實際生活中的例子的抽象,如果還不能了解圖資料庫,就想一下每個城市的公交圖或者地鐵圖,後面散仙會寫一些具體用法的例子。