Neo4j 第三篇:Cypher查詢入門

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

Neo4j使用Cypher查詢圖形數據,Cypher是描述性的圖形查詢語言,語法簡單,功能強大,由於Neo4j在圖形資料庫家族中處於絕對領先的地位,擁有眾多的用戶基數,使得Cypher成為圖形查詢語言的事實上的標準。本文作為入門級的教程,我不會試圖分析Cypher語言的全部內容,本文的目標是循序漸進 ...


Neo4j使用Cypher查詢圖形數據,Cypher是描述性的圖形查詢語言,語法簡單,功能強大,由於Neo4j在圖形資料庫家族中處於絕對領先的地位,擁有眾多的用戶基數,使得Cypher成為圖形查詢語言的事實上的標準。本文作為入門級的教程,我不會試圖分析Cypher語言的全部內容,本文的目標是循序漸進地使用Cypher語言執行簡單的CRUD操作,為了便於演示,本文在Neo4j Browser中執行Cypher示例代碼。以下圖形包含三個節點和兩個關係,本文會一步一步講解如何利用Cypher語言創建以下圖形。

 

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

 

一,easy,熱熱身

和SQL很相似,Cypher語言的關鍵字不區分大小寫,但是屬性值,標簽,關係類型和變數是區分大小寫的。

1,變數(Variable)

變數用於對搜索模式的部分進行命名,併在同一個查詢中引用,在小括弧()中命名變數,變數名是區分大小寫的,示例代碼創建了兩個變數:n和b,通過return子句返回變數b;

MATCH (n)-->(b)
RETURN b

在Cypher查詢中,變數用於引用搜索模式(Pattern),但是變數不是必需的,如果不需要引用,那麼可以忽略變數。

2,訪問屬性

在Cypher查詢中,通過逗號來訪問屬性,格式是:Variable.PropertyKey,通過id函數來訪問實體的ID,格式是id(Variable)。

match (n)-->(b)
where id(n)=5 and b.age=18
return b;

二,創建節點

節點模式的構成:(Variable:Lable1:Lable2{Key1:Value1,Key2,Value2}),實際上,每個節點都有一個整數ID,在創建新的節點時,Neo4j自動為節點設置ID值,在整個資料庫中,節點的ID值是遞增的和唯一的。

下麵的Cypher查詢創建一個節點,標簽是Person,具有兩個屬性name和born,通過RETURN子句,返回新建的節點:

create (n:Person { name: 'Tom Hanks', born: 1956 }) return n;

繼續創建其他節點:

create (n:Person { name: 'Robert Zemeckis', born: 1951 }) return n;
create (n:Movie { title: 'Forrest Gump', released: 1951 }) return n;

三,查詢節點

通過match子句查詢資料庫,match子句用於指定搜索的模式(Pattern),where子句為match模式增加謂詞(Predicate),用於對Pattern進行約束;

1,查詢整個圖形資料庫

match(n) return n;

在圖形資料庫中,有三個節點,Person標簽有連個節點,Movie有1個節點

點擊節點,查看節點的屬性,如圖,Neo4j自動為節點設置ID值,本例中,Forrest Gump節點的ID值是5,

2,查詢born屬性小於1955的節點

match(n) 
where n.born<1955 
return n;

3,查詢具有指定Lable的節點

match(n:Movie) 
return n;

4,查詢具有指定屬性的節點

match(n{name:'Tom Hanks'}) 
return n;

四,創建關係

關係的構成:StartNode - [Variable:RelationshipType{Key1:Value1,Key2:Value2}] -> EndNode,在創建關係時,必須指定關係類型。

1,創建沒有任何屬性的關係

MATCH (a:Person),(b:Movie)
WHERE a.name = 'Robert Zemeckis' AND b.title = 'Forrest Gump'
CREATE (a)-[r:DIRECTED]->(b)
RETURN r;

2,創建關係,並設置關係的屬性

MATCH (a:Person),(b:Movie)
WHERE a.name = 'Tom Hanks' AND b.title = 'Forrest Gump'
CREATE (a)-[r:ACTED_IN { roles:['Forrest'] }]->(b)
RETURN r;

五,查詢關係

在Cypher中,關係分為三種:符號“--”,表示有關係,忽略關係的類型和方向;符號“-->”和“<--”,表示有方向的關係;

1,查詢整個數據圖形

2,查詢跟指定節點有關係的節點

示例腳本返回跟Movie標簽有關係的所有節點

match(n)--(m:Movie) 
return n;

2,查詢有向關係的節點

MATCH (:Person { name: 'Tom Hanks' })-->(movie)
RETURN movie;

3,為關係命名,通過[r]為關係定義一個變數名,通過函數type獲取關係的類型

MATCH (:Person { name: 'Tom Hanks' })-[r]->(movie)
RETURN r,type(r);

4,查詢特定的關係類型,通過[Variable:RelationshipType{Key:Value}]指定關係的類型和屬性

MATCH (:Person { name: 'Tom Hanks' })-[r:ACTED_IN{roles:'Forrest'}]->(movie)
RETURN r,type(r);

六,更新圖形

set子句,用於對更新節點的標簽和實體的屬性;remove子句用於移除實體的屬性和節點的標簽;

1,創建一個完整的Path

由於Path是由節點和關係構成的,當路徑中的關係或節點不存在時,Neo4j會自動創建;

CREATE p =(vic:Worker:Person{ name:'vic',title:"Developer" })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael:Worker:Person { name: 'Michael',title:"Manager" })
RETURN p

變數neo代表的節點沒有任何屬性,但是,其有一個ID值,通過ID值為該節點設置屬性和標簽

2,為節點增加屬性

通過節點的ID獲取節點,Neo4j推薦通過where子句和ID函數來實現。

match (n)
where id(n)=7
set n.name = 'neo'
return n;

3,為節點增加標簽

match (n)
where id(n)=7
set n:Company
return n;

4,為關係增加屬性

match (n)<-[r]-(m)
where id(n)=7 and id(m)=8
set r.team='Azure'
return n;

七,Merge子句

Merge子句的作用有兩個:當模式(Pattern)存在時,匹配該模式;當模式不存在時,創建新的模式,功能是match子句和create的組合。在merge子句之後,可以顯式指定on creae和on match子句,用於修改綁定的節點或關係的屬性。

通過merge子句,你可以指定圖形中必須存在一個節點,該節點必須具有特定的標簽,屬性等,如果不存在,那麼merge子句將創建相應的節點。

1,通過merge子句匹配搜索模式

匹配模式是:一個節點有Person標簽,並且具有name屬性;如果資料庫不存在該模式,那麼創建新的節點;如果存在該模式,那麼綁定該節點;

MERGE (michael:Person { name: 'Michael Douglas' })
RETURN michael;

2,在merge子句中指定on create子句

如果需要創建節點,那麼執行on create子句,修改節點的屬性;

ERGE (keanu:Person { name: 'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
RETURN keanu.name, keanu.created

3,在merge子句中指定on match子句

如果節點已經存在於資料庫中,那麼執行on match子句,修改節點的屬性;

MERGE (person:Person)
ON MATCH SET person.found = TRUE , person.lastAccessed = timestamp()
RETURN person.name, person.found, person.lastAccessed

4,在merge子句中同時指定on create 和 on match子句

MERGE (keanu:Person { name: 'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
ON MATCH SET keanu.lastSeen = timestamp()
RETURN keanu.name, keanu.created, keanu.lastSeen

5,merge子句用於match或create一個關係

MATCH (charlie:Person { name: 'Charlie Sheen' }),(wallStreet:Movie { title: 'Wall Street' })
MERGE (charlie)-[r:ACTED_IN]->(wallStreet)
RETURN charlie.name, type(r), wallStreet.title

6,merge子句用於match或create多個關係

MATCH (oliver:Person { name: 'Oliver Stone' }),(reiner:Person { name: 'Rob Reiner' })
MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner)
RETURN movie

7,merge子句用於子查詢

MATCH (person:Person)
MERGE (city:City { name: person.bornIn })
RETURN person.name, person.bornIn, city;

MATCH (person:Person)
MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur { name: person.chauffeurName })
RETURN person.name, person.chauffeurName, chauffeur;

MATCH (person:Person)
MERGE (city:City { name: person.bornIn })
MERGE (person)-[r:BORN_IN]->(city)
RETURN person.name, person.bornIn, city;

八,跟實體相關的函數

1,通過id函數,返回節點或關係的ID

MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN id(r);

2,通過type函數,查詢關係的類型

MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN type(r);

3,通過lables函數,查詢節點的標簽

MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN lables(movie);

4,通過keys函數,查看節點或關係的屬性鍵

MATCH (a)
WHERE a.name = 'Alice'
RETURN keys(a)

5,通過properties()函數,查看節點或關係的屬性

CREATE (p:Person { name: 'Stefan', city: 'Berlin' })
RETURN properties(p)

 

 

參考文檔:

Chapter 3. Cypher

3.3.16. MERGE


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

-Advertisement-
Play Games
更多相關文章
  • 原文參考http://mp.weixin.qq.com/s/LijjPErxcFB4pN_wUo2cnw 調用函數時,會創建一個新的執行上下文 它的生命周期有兩個階段1創建階段-創建變數對象,建立作用域鏈,確定this的指向2執行階段-執行代碼,完成變數賦值,函數引用及其他代碼的執行 變數對象的創建 ...
  • 前言 本文大量參考了阮一峰老師的開源教程 "ECMAScript6入門" ,適合新手入門或者對ES6常用知識點進行全面回顧,目標是以較少的篇幅涵蓋ES6及部分ES7在實踐中的絕大多數使用場景。更全面、更深入的請進入上面的教程。如果您覺得有遺漏的常見知識點或者錯誤的地方,請評論指出! 新的變數聲明方式 ...
  • <!DOCTYPE html><html><head><meta charset=”utf-8″><title>Vue第一條信息</title><script src=”js/vue.js”></script></head><body><div id=”app”><p>{{ message }}</ ...
  • 文章轉載自 https://github.com/yipianfengye/android-zxingLibrary 在具體介紹該掃描庫之前我們先看一下其具體的使用方式,看看是不是幾行代碼就可以集成二維碼掃描的功能。 在module的build.gradle中執行compile操作 在demo Ap ...
  • 最近沒事看了一下 WKWebView ,就把自己總結的記錄一下,方便查看. 註:一下為個人總結,會有不足,熱烈歡迎大神指點 1> 創建導入:#import <WebKit/WebKit.h> WKWebView *webView = [[WKWebView alloc] initWithFrame: ...
  • 一,工程圖。 二,代碼。 AppDelegate.h AppDelegate.m ...
  • 不知道大家有沒有發現,在一個 Objective-C 和 Swift 混編的 App 中,當把一個 OC 中的參數轉到 Swift 時,Swift 會自動把這個變數進行強制解包。舉個例子,我在 OC 中定義這樣一個變數: 它轉成 Swift 就變成了這樣: 這樣看上去合情合理。Swift 中有 St ...
  • 首先看一下什麼是GTID: GTID(Global Transaction ID)是對於一個已提交事務的編號,並且是一個全局唯一的編號。 GTID實際上是由UUID+TID組成的。其中UUID是一個MySQL實例的唯一標識。TID代表了該實例上已經提交的事務數量,並且隨著事務提交單調遞增。根據GTI ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...