最近這段時間一直在搞知識圖譜的一個項目,有點忙,因此博客更新有點慢,如今第一階段的開發基本完活,後面有空會總結幾篇與neo4j有關的文章。java
有關neo4j的介紹和使用場景,這裏很少說了,不瞭解的朋友能夠參考我以前的文章 http://qindongliang.iteye.com/blog/2327919python
咱們的使用場景是用來存知識圖譜有關的數據簡單說就是會把從小學到高中全部的科目的裏面的知識點給存儲起來,讓後創建知識點與知識點之間的依賴關係,從而最終會造成一張複雜的知識網絡。舉個例子:mongodb
好比某個學生,要學習化學裏面的某個知識點,可是這個知識點可能與物理有聯繫,也可能這個知識點與數學也有聯繫,想要學習和掌握這個知識點,他應該怎麼作呢?有了知識圖譜網絡,就能幫他快速的提供一些有用的信息:數據庫
(1)告訴他先學習那幾個知識點編程
(2)告訴他這個知識點有幾種途徑ruby
(3)告訴他最快的掌握方式是什麼微信
(4)若是掌握了,經過知識點與題目的關聯,能給他出一些起到練習鞏固的效果網絡
(5)其餘....less
固然有了圖譜數據以後,其實能從裏面挖掘出不少其餘的信息,固然須要跟具體的業務結合,才能產生的真正的價值。好比北京市的公交站地圖或者地鐵地圖。異步
言歸正傳,作項目期間大體看了一遍neo4j官網的文檔和它提供的查詢語言cypher(英文爲翻譯的意思)
什麼是Cypher?
cypher是neo4j官網的提供的聲明式圖譜查詢語言,用來可視化查詢展現圖譜裏面的節點和關係,圍繞圖譜查詢提供了可讀性好和容易使用,功能強大的衆多優勢。
按照官網的說法,cypher的產生,參考了動態編程語言的一些語法,如python,ruby,scala,有很是多的強大的函數庫,咱們也項目裏也用了一些複雜的語法,確實很是強大,不過想要運用自如,確實得花必定時間測試使用才行。
下面介紹下neo4j的幾個核心概念:
圖譜的基本單位主要是節點和關係,他們均可以包含屬性,一個節點就是一行數據,一個關係也是一行數據,裏面的屬性就是數據庫裏面的row裏面的字段。
除了屬性以外,關係和節點還能夠有零到多個標籤,標籤也能夠認爲是一個特殊分組方式。
關係的功能是組織和鏈接節點,一個關係鏈接2個節點,一個開始節點和一個結束節點。當全部的點被鏈接起來,就造成了一張圖譜,經過關係能夠組織節點造成任意的結構,好比list,tree,map,tuple,或者更復雜的結構。關係擁有方向進和出,表明一種指向。
屬性很是相似數據庫裏面的字段,只有節點和關係能夠擁有0到多個屬性,屬性類型基本和java的數據類型一致,分爲 數值,字符串,布爾,以及其餘的一些類型,字段名必須是字符串。
標籤經過形容一種角色或者給節點加上一種類型,一個節點能夠有多個類型,經過類型區分一類節點,這樣在查詢時候能夠更加方便和高效,除此以外標籤在給屬性創建索引或者約束時候也會用到。label名稱必須是非空的unicode字符串,另外lables最大標記容量是int的最大值,近似21億。
查詢時候一般是遍歷圖譜而後找到路徑,在遍歷時一般會有一個開始節點,而後根據cpyher提供的查詢語句,遍歷相關路徑上的節點和關係,從而獲得最終的結果。
路徑是一個或多個節點經過關係鏈接起來的產物,例如獲得圖譜查詢或者遍歷的結果。
neo4j是一個無模式或者less模式的圖譜數據庫,像mongodb,solr,lucene或者es同樣,你可使用它不須要定義任何schema,
Indexes(索引)
遍歷圖經過須要大量的隨機讀寫,若是沒有索引,則可能意味着每次都是全圖掃描,這樣效率很是低下,爲了得到更好的性能,咱們能夠在字段屬性上構建索引,這樣任何查詢操做都會使用索引,從而大幅度提高seek性能,
構建索引是一個異步請求,並不會馬上生效,會再後臺建立直至成功後,才能最終生效。若是建立失敗,能夠重建索引,先刪除索引,在建立便可,而後從log裏面找出建立失敗的緣由而後分析。
Constraints(約束)
約束能夠定義在某個字段上,限制字段值惟一,建立約束會自動建立索引。
至此對neo4j裏面的核心概念已經介紹完畢,其實就是實際生活中的例子的抽象,若是還不能理解圖數據庫,就想一下每一個城市的公交圖或者地鐵圖,後面散仙會寫一些具體用法的例子。
有什麼問題能夠掃碼關注微信公衆號:我是攻城師(woshigcs),在後臺留言諮詢。 技術債不能欠,健康債更不能欠, 求道之路,與君同行。