Neo4j 第二篇:圖形資料庫

来源:http://www.cnblogs.com/ljhdo/archive/2017/05/22/5178225.html
-Advertisement-
Play Games

在深入學習圖形資料庫之前,首先理解屬性圖的基本概念。一個屬性圖是由頂點(Vertex),邊(Edge),標簽(Lable),關係類型和屬性(Property)組成的有向圖。頂點也稱作節點(Node),邊也稱作關係(Relationship);在圖形中,節點和關係是最重要的實體,所有的節點是獨立存在的 ...


在深入學習圖形資料庫之前,首先理解屬性圖的基本概念。一個屬性圖是由頂點(Vertex),邊(Edge),標簽(Lable),關係類型和屬性(Property)組成的有向圖。頂點也稱作節點(Node),邊也稱作關係(Relationship);在圖形中,節點和關係是最重要的實體,所有的節點是獨立存在的,為節點設置標簽,那麼擁有相同標簽的節點屬於一個分組,一個集合;關係通過關係類型來分組,類型相同的關係屬於同一個集合。關係是有向的,關係的兩端是起始節點和結束節點,通過有向的箭頭來標識方向,節點之間的雙向關係通過兩個方向相反的關係來標識。節點可有零個,一個或多個標簽,但是關係必須設置關係類型,並且只能設置一個關係類型。Neo4j圖形資料庫的查詢語言是Cypher,用於操作屬性圖,是圖形語言中事實上的標準。

 

我的Neo4j系列的文章收錄在:Neo4j

 

一,圖形資料庫的基本概念

Neo4j創建的圖(Graph)基於屬性圖模型,在該模型中,每個實體都有ID(Identity)唯一標識,每個節點由標簽(Lable)分組,每個關係都有一個唯一的類型,屬性圖模型的基本概念有:

  • 實體(Entity)是指節點(Node)和關係(Relationship);
    • 每個實體都有一個唯一的ID;
    • 每個實體都有零個,一個或多個屬性,一個實體的屬性鍵是唯一的;
    • 每個節點都有零個,一個或多個標簽,屬於一個或多個分組;
    • 每個關係都只有一個類型,用於連接兩個節點;
  • 路徑(Path)是指由起始節點和終止節點之間的實體(節點和關係)構成的有序組合;
  • 標記(Token)是非空的字元串,用於標識標簽(Lable),關係類型(Relationship Type),或屬性鍵(Property Key);
    • 標簽:用於標記節點的分組,多個節點可以有相同的標簽,一個節點可以有多個Lable,Lable用於對節點進行分組;
    • 關係類型:用於標記關係的類型,多個關係可以有相同的關係類型;
    • 屬性鍵:用於唯一標識一個屬性;
  • 屬性(Property)是一個鍵值對(Key/Value Pair),每個節點或關係可以有一個或多個屬性;屬性值可以是標量類型,或這標量類型的列表(數組);

二,圖形示例

在下麵的圖形中,存在三個節點和兩個關係共5個實體;Person和Movie是Lable,ACTED_ID和DIRECTED是關係類型,name,title,roles等是節點和關係的屬性。

實體包括節點和關係,節點有標簽和屬性,關係是有向的,鏈接兩個節點,具有屬性和關係類型。

1,實體

在示例圖形中,包含三個節點,分別是:

包含兩個關係,分別是:

  • 兩個關係類型:ACTED_IN和DIRECTED,
  • 兩個關係:連接name屬性為Tom Hank節點和Movie節點的關係,連接name屬性為Forrest Gump的節點和Movie節點的關係。

其中一個關係如下圖:

2,標簽(Lable)

在圖形結構中,標簽用於對節點進行分組,相當於節點的類型,擁有相同標簽的節點屬於同一個分組。一個節點可以擁有零個,一個或多個標簽,因此,一個節點可以屬於多個分組。對分組進行查詢,能夠縮小查詢的節點範圍,提高查詢的性能。

在示例圖形中,有兩個標簽Person和Movie,兩個節點是Person,一個節點是Movie,標簽有點像節點的類型,但是,每個節點可以有多個標簽。

3,屬性(Property)

屬性是一個鍵值對(Key/Value),用於為節點或關係提供信息。一般情況下,每個節點都由name屬性,用於命名節點。

在示例圖形中,Person節點有兩個屬性name和title,Movie節點有兩個屬性:title和released,

關係類型ACTED_IN有一個屬性:roles,該屬性值是一個數組,而關係類型為DIRECTED的關係沒有屬性

三,遍歷(Traversal)

遍歷一個圖形,是指沿著關係及其方向,訪問圖形的節點。關係是有向的,連接兩個節點,從起始節點沿著關係,一步一步導航(navigate)到結束節點的過程叫做遍歷,遍歷經過的節點和關係的有序組合稱作路徑(Path)。

在示例圖形中,查找Tom Hanks參演的電影,遍歷的過程是:從Tom Hanks節點開始,沿著ACTED_IN關係,尋找標簽為Movie的目標節點。

遍歷的路徑如圖:

 

四,圖形資料庫的模式

Neo4j的模式(Schema)通常是指索引,約束和統計,通過創建模式,Neo4j能夠獲得查詢性能的提升和建模的便利;Neo4j資料庫的模式可選的,也可以是無模式的。

1,索引

圖形資料庫也能創建索引,用於提高圖形資料庫的查詢性能。和關係型資料庫一樣,索引是圖形數據的一個冗餘副本,通過額外的存儲空間和犧牲數據寫操作的性能,來提高數據搜索的性能,避免創建不必要的索引,這樣能夠減少數據更新的性能損失。

Neo4j在圖形節點的一個或多個屬性上創建索引,在索引創建完成之後,當圖形數據更新時,Neo4j負責索引的自動更新,索引的數據是實時同步的;在查詢被索引的屬性時,Neo4j自動應用索引,以獲得查詢性能的提升。

例如,使用Cypher創建索引:

CREATE INDEX ON :Person(firstname)
CREATE INDEX ON :Person(firstname, surname)

2,約束

在圖形資料庫中,能夠創建四種類型的約束:

  • 節點屬性值唯一約束(Unique node property):如果節點具有指定的標簽和指定的屬性,那麼這些節點的屬性值是唯一的
  • 節點屬性存在約束(Node property existence):創建的節點必須存在標簽和指定的屬性
  • 關係屬性存在約束(Relationship property existence):創建的關係存在類型和指定的屬性
  • 節點鍵約束(Node Key):在指定的標簽中的節點中,指定的屬性必須存在,並且屬性值的組合是唯一的

例如,使用Cypher創建約束:

CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE;
CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn);
CREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day);
CREATE CONSTRAINT ON (n:Person) ASSERT (n.firstname, n.surname) IS NODE KEY;

3,統計信息

當使用Cypher查詢圖形資料庫時,Cypher腳本被編譯成一個執行計劃,執行該執行計劃獲得查詢結果。為了生成一個性能優化的執行計劃,Neo4j需要收集統計信息以對查詢進行優化。當統計信息變化到一定的賦值時,Neo4j需要重新生成執行計劃,以保證Cypher查詢是性能優化的,Neo4j存儲的統計信息包括:

  • The number of nodes with a certain label.
  • Selectivity per index. 
  • The number of relationships by type.
  • The number of relationships by type, ending or starting from a node with a specific label.

預設情況下,Neo4j自動更新統計信息,但是,統計信息的更新不是實時的,更新統計信息可能是一個非常耗時的操作,因此,Neo4j在後臺運行,並且只有當變化的數據達到一定的閾值時,才會更新統計信息。

Neo4j keeps the statistics up to date in two different ways. For label counts for example, the number is updated whenever you set or remove a label from a node. For indexes, Neo4j needs to scan the full index to produce the selectivity number. Since this is potentially a very time-consuming operation, these numbers are collected in the background when enough data on the index has been changed.

Neo4j把執行計劃被緩存起來,在統計信息變化之前,執行計劃不會被重新生成。通過配置選項,Neo4j能夠控制執行計劃的重新生成:

  • dbms.index_sampling.background_enabled:是否在後臺統計索引信息,由於Cypher查詢的執行計劃是根據統計信息生成的,及時更新索引的統計數據對生成性能優化的執行計劃非常重要;
  • dbms.index_sampling.update_percentage:在更新索引的統計信息之前,索引中有多大比例的數據被更新;
  • cypher.statistics_divergence_threshold:當統計信息變化時,Neo4j不會立即更新Cypher查詢的執行計劃;只有當統計信息變化到一定的程度時,Neo4j才會重新生成執行計劃。

 

參考文檔:

Graph database concepts

Chapter 3. Cypher


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文轉載自http://www.jianshu.com/p/d7665192aaaf 說起MySQL的查詢優化,相信大家積累一堆技巧:不能使用SELECT *、不使用NULL欄位、合理創建索引、為欄位選擇合適的數據類型..... 你是否真的理解這些優化技巧?是否理解其背後的工作原理?在實際場景下性能 ...
  • mysql多實例監控實錄 系統環境: cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) 內核版本: uname -r 3.10.0-514.el7.x86_64 docker版本: docker -v Docker versio ...
  • MySQL學習筆記-子查詢和連接 使客戶端進入gbk編碼方式顯示: mysql> SET NAMES gbk; 1.子查詢 子查詢的定義: 子查詢(Subquery)是指出現在其他SQL語句內的SELECT子句。 例如: SELECT * FROM t1 WHERE col1 = (SELECT c ...
  • Spark GraphX是一個分散式的圖處理框架。社交網路中,用戶與用戶之間會存在錯綜複雜的聯繫,如微信、QQ、微博的用戶之間的好友、關註等關係,構成了一張巨大的圖,單機無法處理,只能使用分散式圖處理框架處理,Spark GraphX就是一種分散式圖處理框架。 1. POM文件 在項目的pom文件中 ...
  • 轉載自 http://blog.csdn.net/happymagic/article/details/51835522 SQL Server 開啟遠程訪問的方法: 註意事項:(重點) 此次演示版本為 SQL Server 2014 1. 用電腦名訪問伺服器時,需要開啟sql server bro ...
  • 某現場報一個SQL死鎖,於是開啟了1222跟蹤: 一段時間之後拷貝ERROR文件查找相關信息,比較有用的摘錄出來如下: 語句一: 語句二: 相關的死鎖資源如下: 可以明顯的看到是select語句與insert語句產生了死鎖,爭用的資源分別6996和11086這兩個page。 因此根據死鎖的產生原理決 ...
  • 怎樣在eclipse開發環境中連接資料庫並測試連接是否成功 1)eclipse開發環境里沒有集成mysql的驅動,需要從以下地址下載連接驅動程式mysql-connector-java-XX-XX-XX.zip: http://dev.mysql.com/downloads/connector/j ...
  • 一、Redis簡介 1.關於關係型資料庫和nosql資料庫 關係型資料庫是基於關係表的資料庫,最終會將數據持久化到磁碟上,而nosql數據 庫是基於特殊的結構,並將數據存儲到記憶體的資料庫。從性能上而言,nosql資料庫 要優於關係型資料庫,從安全性上而言關係型資料庫要優於nosql資料庫,所以在實 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...