日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

史上超全面的Neo4j使用指南

 遠(yuǎn)方 2020-04-10

Create by yster@foxmail.com 2018-7-10

我的博客:https://blog.csdn.net/yueshutong123

W3Cschool文檔:https://www./neo4j/neo4j_features_advantages.html

neo4j-examples:https://github.com/neo4j-examples/

第一章:介紹

Neo4j是什么

Neo4j是一個(gè)高性能的,NOSQL圖形數(shù)據(jù)庫(kù),它將結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在網(wǎng)絡(luò)上而不是表中。它是一個(gè)嵌入式的、基于磁盤(pán)的、具備完全的事務(wù)特性的Java持久化引擎,但是它將結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在網(wǎng)絡(luò)(從數(shù)學(xué)角度叫做圖)上而不是表中。Neo4j也可以被看作是一個(gè)高性能的圖引擎,該引擎具有成熟數(shù)據(jù)庫(kù)的所有特性。程序員工作在一個(gè)面向?qū)ο蟮?、靈活的網(wǎng)絡(luò)結(jié)構(gòu)下而不是嚴(yán)格、靜態(tài)的表中——但是他們可以享受到具備完全的事務(wù)特性、企業(yè)級(jí)的數(shù)據(jù)庫(kù)的所有好處。

Neo4j的特點(diǎn)

SQL就像簡(jiǎn)單的查詢(xún)語(yǔ)言Neo4j CQL

它遵循屬性圖數(shù)據(jù)模型

它通過(guò)使用Apache Lucence支持索引

它支持UNIQUE約束

它它包含一個(gè)用于執(zhí)行CQL命令的UI:Neo4j數(shù)據(jù)瀏覽器

它支持完整的ACID(原子性,一致性,隔離性和持久性)規(guī)則

它采用原生圖形庫(kù)與本地GPE(圖形處理引擎)

它支持查詢(xún)的數(shù)據(jù)導(dǎo)出到JSON和XLS格式

它提供了REST API,可以被任何編程語(yǔ)言(如Java,Spring,Scala等)訪問(wèn)

它提供了可以通過(guò)任何UI MVC框架(如Node JS)訪問(wèn)的Java腳本

它支持兩種Java API:Cypher API和Native Java API來(lái)開(kāi)發(fā)Java應(yīng)用程序

Neo4j的優(yōu)點(diǎn)

它很容易表示連接的數(shù)據(jù)

檢索/遍歷/導(dǎo)航更多的連接數(shù)據(jù)是非常容易和快速的

它非常容易地表示半結(jié)構(gòu)化數(shù)據(jù)

Neo4j CQL查詢(xún)語(yǔ)言命令是人性化的可讀格式,非常容易學(xué)習(xí)

它使用簡(jiǎn)單而強(qiáng)大的數(shù)據(jù)模型

它不需要復(fù)雜的連接來(lái)檢索連接的/相關(guān)的數(shù)據(jù),因?yàn)樗苋菀讬z索它的相鄰節(jié)點(diǎn)或關(guān)系細(xì)節(jié)沒(méi)有連接或索引

第二章:安裝

1.環(huán)境

Centos 7.4

neo4j-community-3.4.1.tar.gz

2.下載

下載地址 https:///download/other-releases/

下載wget https:///artifact.php?name=neo4j-community-3.4.1-unix.tar.gz

解壓tar -zxvf neo4j-community-3.4.1.tar.gz

3.開(kāi)啟遠(yuǎn)程訪問(wèn)

一、對(duì)于3.0以前的版本

在安裝目錄的 $NEO4J_HOME/conf/neo4j.conf 文件內(nèi),找到下面一行,將注釋#號(hào)去掉就可以了 #dbms.connector.https.address=localhost:7473 改為 dbms.connector.https.address=0.0.0.0:7473 這樣,遠(yuǎn)程其他電腦可以用本機(jī)的IP或者域名后面跟上7474 端口就能打開(kāi)web界面了 如: https://:7473

當(dāng)然,你的操作系統(tǒng)的防火墻也要確保開(kāi)放了7474端口才行,防火墻怎樣開(kāi)放請(qǐng)自行針對(duì)自己的操作系統(tǒng)查找文檔

二、對(duì)于3.1及以后的版本

在安裝目錄的 $NEO4J_HOME/conf/neo4j.conf 文件內(nèi),找到下面一行,將注釋#號(hào)去掉就可以了 dbms.connectors.default_listen_address=0.0.0.0

4.測(cè)試

在bin目錄下,執(zhí)行命令:./neo4j start啟動(dòng),其他命令 { console | start | stop | restart | status } 

訪問(wèn)http://IP地址:7474/, 出現(xiàn)下圖即代表安裝成功,頂部的$輸入框用來(lái)執(zhí)行下面的CQL語(yǔ)句。

第三章:CQL

1.CQL簡(jiǎn)介

CQL代表Cypher查詢(xún)語(yǔ)言。 像Oracle數(shù)據(jù)庫(kù)具有查詢(xún)語(yǔ)言SQL,Neo4j具有CQL作為查詢(xún)語(yǔ)言。

Neo4j CQL -

它是Neo4j圖形數(shù)據(jù)庫(kù)的查詢(xún)語(yǔ)言。

它是一種聲明性模式匹配語(yǔ)言

它遵循SQL語(yǔ)法。

它的語(yǔ)法是非常簡(jiǎn)單且人性化、可讀的格式。

如Oracle SQL -

Neo4j CQL 已命令來(lái)執(zhí)行數(shù)據(jù)庫(kù)操作。

Neo4j CQL 支持多個(gè)子句像在哪里,順序等,以非常簡(jiǎn)單的方式編寫(xiě)非常復(fù)雜的查詢(xún)。

NNeo4j CQL 支持一些功能,如字符串,Aggregation.In 加入他們,它還支持一些關(guān)系功能。

2.Neo4j CQL命令/條款

常用的Neo4j CQL命令/條款如下:

S.No.

CQL命令/條

用法

1。

CREATE 創(chuàng)建

創(chuàng)建節(jié)點(diǎn),關(guān)系和屬性

2。

MATCH 匹配

檢索有關(guān)節(jié)點(diǎn),關(guān)系和屬性數(shù)據(jù)

3。

RETURN 返回

返回查詢(xún)結(jié)果

4。

WHERE 哪里

提供條件過(guò)濾檢索數(shù)據(jù)

5。

DELETE 刪除

刪除節(jié)點(diǎn)和關(guān)系

6。

REMOVE 移除

刪除節(jié)點(diǎn)和關(guān)系的屬性

7。

ORDER BY以…排序

排序檢索數(shù)據(jù)

8。

SET 組

添加或更新標(biāo)簽

3.Neo4j CQL 函數(shù)

以下是常用的Neo4j CQL函數(shù):

S.No.

定制列表功能

用法

1。

String 字符串

它們用于使用String字面量。

2。

Aggregation 聚合

它們用于對(duì)CQL查詢(xún)結(jié)果執(zhí)行一些聚合操作。

3。

Relationship 關(guān)系

他們用于獲取關(guān)系的細(xì)節(jié),如startnode,endnode等。

我們將在后面的章節(jié)中詳細(xì)討論所有Neo4j CQL命令,子句和函數(shù)語(yǔ)法,用法和示例。

4.Neo4j CQL數(shù)據(jù)類(lèi)型

這些數(shù)據(jù)類(lèi)型與Java語(yǔ)言類(lèi)似。 它們用于定義節(jié)點(diǎn)或關(guān)系的屬性

Neo4j CQL支持以下數(shù)據(jù)類(lèi)型:

S.No.

CQL數(shù)據(jù)類(lèi)型

用法

1.

boolean

用于表示布爾文字:true,false。

2.

byte

用于表示8位整數(shù)。

3.

short

用于表示16位整數(shù)。

4.

int

用于表示32位整數(shù)。

5.

long

用于表示64位整數(shù)。

6.

float

I用于表示32位浮點(diǎn)數(shù)。

7.

double

用于表示64位浮點(diǎn)數(shù)。

8.

char

用于表示16位字符。

9.

String

用于表示字符串。

第四章:命令

1.CREATE創(chuàng)建

Neo4j CQL創(chuàng)建一個(gè)沒(méi)有屬性的節(jié)點(diǎn)CREATE (:)

語(yǔ)法說(shuō)明

規(guī)范說(shuō)法是節(jié)點(diǎn)標(biāo)簽名稱(chēng),其實(shí)相當(dāng)于Mysql數(shù)據(jù)庫(kù)中的表名,而是節(jié)點(diǎn)名稱(chēng),其實(shí)代指創(chuàng)建的此行數(shù)據(jù)。

示例CREATE (emp:Employee)

或者CREATE (:Employee)

Neo4j CQL創(chuàng)建具有屬性的節(jié)點(diǎn)

Neo4j CQL“CREATE”命令用于創(chuàng)建帶有屬性的節(jié)點(diǎn)。 它創(chuàng)建一個(gè)具有一些屬性(鍵值對(duì))的節(jié)點(diǎn)來(lái)存儲(chǔ)數(shù)據(jù)。CREATE (    :   {           :      ........       :   } )

示例CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" })

創(chuàng)建多個(gè)標(biāo)簽到節(jié)點(diǎn)

語(yǔ)法:CREATE (::.....:)

示例CREATE (m:Movie:Cinema:Film:Picture)

2.MATCH查詢(xún)

Neo4j CQL MATCH命令用于

從數(shù)據(jù)庫(kù)獲取有關(guān)節(jié)點(diǎn)和屬性的數(shù)據(jù)

從數(shù)據(jù)庫(kù)獲取有關(guān)節(jié)點(diǎn),關(guān)系和屬性的數(shù)據(jù)

MATCH命令語(yǔ)法:MATCH  (    :)

示例MATCH (dept:Dept)

但是執(zhí)行后會(huì)報(bào)錯(cuò):Neo.ClientError.Statement.SyntaxError:  Query cannot conclude with MATCH  (must be RETURN or an update clause) (line 1, column 1 (offset: 0))

如果你觀察到錯(cuò)誤消息,它告訴我們,我們可以使用MATCH命令與RETURN子句或UPDATA子句。

3.RETURN返回

Neo4j CQL RETURN子句用于 -

檢索節(jié)點(diǎn)的某些屬性

檢索節(jié)點(diǎn)的所有屬性

檢索節(jié)點(diǎn)和關(guān)聯(lián)關(guān)系的某些屬性

檢索節(jié)點(diǎn)和關(guān)聯(lián)關(guān)系的所有屬性

RETURN命令語(yǔ)法:RETURN     .,    ........    .

示例MATCH (e:Employee) RETURN e

或MATCH (dept: Dept) RETURN dept.deptno,dept.dname,dept.location

4.關(guān)系基礎(chǔ)

Neo4j圖數(shù)據(jù)庫(kù)遵循屬性圖模型來(lái)存儲(chǔ)和管理其數(shù)據(jù)。

根據(jù)屬性圖模型,關(guān)系應(yīng)該是定向的。 否則,Neo4j將拋出一個(gè)錯(cuò)誤消息。

基于方向性,Neo4j關(guān)系被分為兩種主要類(lèi)型。

單向關(guān)系

雙向關(guān)系

使用新節(jié)點(diǎn)創(chuàng)建關(guān)系

示例CREATE (e:Employee)-[r:DemoRelation]->(c:Employee)

這句會(huì)創(chuàng)建節(jié)點(diǎn)e,節(jié)點(diǎn)c,以及e -> c的關(guān)系r,這里需要注意方向,比如雙向是CREATE (e:Employee)<-[r:DemoRelation]->(c:Employee)

使用已知節(jié)點(diǎn)創(chuàng)建帶屬性的關(guān)系:MATCH (:),(:) CREATE       ()-[:    {}]->() RETURN 

還是一系列鍵值對(duì)

示例MATCH (cust:Customer),(cc:CreditCard)  CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc)  RETURN r

檢索關(guān)系節(jié)點(diǎn)的詳細(xì)信息:MATCH  ()-[:]->() RETURN 

示例MATCH (cust)-[r:DO_SHOPPING_WITH]->(cc)  RETURN cust,cc

5.WHERE子句

像SQL一樣,Neo4j CQL在CQL MATCH命令中提供了WHERE子句來(lái)過(guò)濾MATCH查詢(xún)的結(jié)果。

簡(jiǎn)單WHERE子句語(yǔ)法WHERE   

語(yǔ)法說(shuō)明:

S.No.

語(yǔ)法元素

描述

1

WHERE

它是一個(gè)Neo4j CQL關(guān)鍵字。

2

<屬性名稱(chēng)>

它是節(jié)點(diǎn)或關(guān)系的屬性名稱(chēng)。

3

<比較運(yùn)算符>

它是Neo4j CQL比較運(yùn)算符之一。

4

<值>

它是一個(gè)字面值,如數(shù)字文字,字符串文字等。

Neo4j CQL中的比較運(yùn)算符

Neo4j 支持以下的比較運(yùn)算符,在 Neo4j CQL WHERE 子句中使用來(lái)支持條件

S.No.

布爾運(yùn)算符

描述

1.

=

它是Neo4j CQL“等于”運(yùn)算符。

2.

<>

它是一個(gè)Neo4j CQL“不等于”運(yùn)算符。

3.

<

它是一個(gè)Neo4j CQL“小于”運(yùn)算符。

4.

>

它是一個(gè)Neo4j CQL“大于”運(yùn)算符。

5.

<=

它是一個(gè)Neo4j CQL“小于或等于”運(yùn)算符。

6.

=

它是一個(gè)Neo4j CQL“大于或等于”運(yùn)算符。

我們可以使用布爾運(yùn)算符在同一命令上放置多個(gè)條件。

Neo4j CQL中的布爾運(yùn)算符

Neo4j支持以下布爾運(yùn)算符在Neo4j CQL WHERE子句中使用以支持多個(gè)條件。

S.No.

布爾運(yùn)算符

描述

1

AND

它是一個(gè)支持AND操作的Neo4j CQL關(guān)鍵字。

2

OR

它是一個(gè)Neo4j CQL關(guān)鍵字來(lái)支持OR操作。

3

NOT

它是一個(gè)Neo4j CQL關(guān)鍵字支持NOT操作。

4

XOR

它是一個(gè)支持XOR操作的Neo4j CQL關(guān)鍵字。

示例MATCH (emp:Employee)  WHERE emp.name = 'Abc' OR emp.name = 'Xyz' RETURN emp

利用WHERE創(chuàng)建指定關(guān)系節(jié)點(diǎn):MATCH (cust:Customer),(cc:CreditCard)  WHERE cust.id = "1001" AND cc.id= "5001"  CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc)  RETURN r

有必要補(bǔ)充一下,可以不使用WHERE達(dá)到WHERE的一些效果,比如MATCH p=(m:Bot{id:123})<-[:BotRelation]->(:Bot)  RETURN p

6.DELETE刪除

Neo4j使用CQL DELETE子句

刪除節(jié)點(diǎn)。

刪除節(jié)點(diǎn)及相關(guān)節(jié)點(diǎn)和關(guān)系。

DELETE節(jié)點(diǎn)子句語(yǔ)法DELETE 

示例MATCH (e: Employee) DELETE e

DELETE節(jié)點(diǎn)和關(guān)系子句語(yǔ)法DELETE ,,

示例MATCH (cc: CreditCard)-[rel]-(c:Customer)  DELETE cc,c,rel

7.REMOVE刪除

有時(shí)基于我們的客戶(hù)端要求,我們需要向現(xiàn)有節(jié)點(diǎn)或關(guān)系添加或刪除屬性。

我們使用Neo4j CQL SET子句向現(xiàn)有節(jié)點(diǎn)或關(guān)系添加新屬性。

我們使用Neo4j CQL REMOVE子句來(lái)刪除節(jié)點(diǎn)或關(guān)系的現(xiàn)有屬性。

Neo4j CQL REMOVE命令用于

刪除節(jié)點(diǎn)或關(guān)系的標(biāo)簽

刪除節(jié)點(diǎn)或關(guān)系的屬性

Neo4j CQL DELETE和REMOVE命令之間的主要區(qū)別 -

DELETE操作用于刪除節(jié)點(diǎn)和關(guān)聯(lián)關(guān)系。

REMOVE操作用于刪除標(biāo)簽和屬性。

Neo4j CQL DELETE和REMOVE命令之間的相似性 -

這兩個(gè)命令不應(yīng)單獨(dú)使用。

兩個(gè)命令都應(yīng)該與MATCH命令一起使用。

1.REMOVE屬性子句語(yǔ)法REMOVE .,.

語(yǔ)法說(shuō)明:

S.No.

語(yǔ)法元素

描述

1。

它是節(jié)點(diǎn)的名稱(chēng)。

2。

它是節(jié)點(diǎn)的屬性名稱(chēng)。

示例

這里我們可以觀察到DebitCard節(jié)點(diǎn)包含6個(gè)屬性。

在數(shù)據(jù)瀏覽器上鍵入以下命令刪除cvv屬性MATCH (dc:DebitCard)  REMOVE dc.cvv RETURN dc

2.REMOVE一個(gè)Label子句語(yǔ)法:REMOVE 

S.No.

語(yǔ)法元素

描述

1.

REMOVE

它是一個(gè)Neo4j CQL關(guān)鍵字。

2.

它是一個(gè)標(biāo)簽列表,用于永久性地從節(jié)點(diǎn)或關(guān)系中刪除它。

語(yǔ)法:,  .... :

示例

1.我們創(chuàng)建一個(gè)含有兩個(gè)標(biāo)簽的節(jié)點(diǎn):CREATE (m:Movie:Pic)

2.查詢(xún)?cè)摴?jié)點(diǎn)MATCH (n:Movie) RETURN n

3.刪除標(biāo)簽MATCH (m:Movie)  REMOVE m:Pic

4.再次查詢(xún)

8.SET子句

有時(shí),根據(jù)我們的客戶(hù)端要求,我們需要向現(xiàn)有節(jié)點(diǎn)或關(guān)系添加新屬性。

要做到這一點(diǎn),Neo4j CQL提供了一個(gè)SET子句。

Neo4j CQL已提供SET子句來(lái)執(zhí)行以下操作。

向現(xiàn)有節(jié)點(diǎn)或關(guān)系添加新屬性

添加或更新屬性值

SET子句語(yǔ)法SET  .,....

語(yǔ)法說(shuō)明:

S.No.

語(yǔ)法元素

描述

1

<節(jié)點(diǎn)標(biāo)簽名稱(chēng)>

這是一個(gè)節(jié)點(diǎn)的標(biāo)簽名稱(chēng)。

2

<屬性名稱(chēng)>

它是一個(gè)節(jié)點(diǎn)的屬性名。

示例MATCH (dc:DebitCard) SET dc.atm_pin = 3456 RETURN dc

9.ORDER BY排序

Neo4j CQL ORDER BY子句

Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,對(duì)MATCH查詢(xún)返回的結(jié)果進(jìn)行排序。

我們可以按升序或降序?qū)π羞M(jìn)行排序。

默認(rèn)情況下,它按升序?qū)π羞M(jìn)行排序。 如果我們要按降序?qū)λ鼈冞M(jìn)行排序,我們需要使用DESC子句。

ORDER BY子句語(yǔ)法ORDER BY    [DESC]

語(yǔ)法:.,.,  .... .

S.No.

語(yǔ)法元素

描述

1。

它是節(jié)點(diǎn)的標(biāo)簽名稱(chēng)。

2。

它是節(jié)點(diǎn)的屬性名稱(chēng)。

示例MATCH (emp:Employee) RETURN emp.empid,emp.name,emp.salary,emp.deptno ORDER BY emp.name

10.UNION子句

與SQL一樣,Neo4j CQL有兩個(gè)子句,將兩個(gè)不同的結(jié)果合并成一組結(jié)果

UNION

UNION ALL

UNION子句

它將兩組結(jié)果中的公共行組合并返回到一組結(jié)果中。 它不從兩個(gè)節(jié)點(diǎn)返回重復(fù)的行。

限制:

結(jié)果列類(lèi)型和來(lái)自?xún)山M結(jié)果的名稱(chēng)必須匹配,這意味著列名稱(chēng)應(yīng)該相同,列的數(shù)據(jù)類(lèi)型應(yīng)該相同。

UNION子句語(yǔ)法   UNION

S.No.

語(yǔ)法元素

描述

1。

它是CQL MATCH命令,由UNION子句使用。

2。

它是CQL MATCH命令兩個(gè)由UNION子句使用。

3。

UNION

它是UNION子句的Neo4j CQL關(guān)鍵字。

注意 -

如果這兩個(gè)查詢(xún)不返回相同的列名和數(shù)據(jù)類(lèi)型,那么它拋出一個(gè)錯(cuò)誤。

示例MATCH (cc:CreditCard) RETURN cc.id,cc.number UNION MATCH (dc:DebitCard) RETURN dc.id,dc.number

UNION ALL子句

它結(jié)合并返回兩個(gè)結(jié)果集的所有行成一個(gè)單一的結(jié)果集。它還返回由兩個(gè)節(jié)點(diǎn)重復(fù)行。

限制

結(jié)果列類(lèi)型,并從兩個(gè)結(jié)果集的名字必須匹配,這意味著列名稱(chēng)應(yīng)該是相同的,列的數(shù)據(jù)類(lèi)型應(yīng)該是相同的。

UNION ALL子句語(yǔ)法UNION ALL

示例MATCH (cc:CreditCard) RETURN cc.id,cc.number UNION ALL MATCH (dc:DebitCard) RETURN dc.id,dc.number

11.LIMIT和SKIP子句

Neo4j CQL已提供LIMIT子句和SKIP來(lái)過(guò)濾或限制查詢(xún)返回的行數(shù)。

簡(jiǎn)單來(lái)說(shuō):LIMIT返回前幾行,SKIP返回后幾行。

LIMIT 示例MATCH (emp:Employee)  RETURN emp LIMIT 2

它只返回Top的兩個(gè)結(jié)果,因?yàn)槲覀兌x了limit = 2。這意味著前兩行。

SKIP示例MATCH (emp:Employee)  RETURN emp SKIP 2

它只返回來(lái)自Bottom的兩個(gè)結(jié)果,因?yàn)槲覀兌x了skip = 2。這意味著最后兩行。

12.MERGE命令

Neo4j使用CQL MERGE命令 -

創(chuàng)建節(jié)點(diǎn),關(guān)系和屬性

為從數(shù)據(jù)庫(kù)檢索數(shù)據(jù)

MERGE命令是CREATE命令和MATCH命令的組合。MERGE = CREATE + MATCH

Neo4j CQL MERGE命令在圖中搜索給定模式,如果存在,則返回結(jié)果

如果它不存在于圖中,則它創(chuàng)建新的節(jié)點(diǎn)/關(guān)系并返回結(jié)果。

Neo4j CQL MERGE語(yǔ)法MERGE (:{    :<1-Value>    .....    :})

注意 -

Neo4j CQL MERGE命令語(yǔ)法與CQL CREATE命令類(lèi)似。

我們將使用這兩個(gè)命令執(zhí)行以下操作 -

創(chuàng)建具有一個(gè)屬性的配置文件節(jié)點(diǎn):Id,名稱(chēng)

創(chuàng)建具有相同屬性的同一個(gè)Profile節(jié)點(diǎn):Id,Name

檢索所有Profile節(jié)點(diǎn)詳細(xì)信息并觀察結(jié)果

我們將使用CREATE命令執(zhí)行這些操作:MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})MATCH  (gp1:GoogleProfile1)  RETURN gp1.Id,gp1.Name

如果我們觀察上面的查詢(xún)結(jié)果,它只顯示一行,因?yàn)镃QL MERGE命令檢查該節(jié)點(diǎn)在數(shù)據(jù)庫(kù)中是否可用。 如果它不存在,它創(chuàng)建新節(jié)點(diǎn)。 否則,它不創(chuàng)建新的。

通過(guò)觀察這些結(jié)果,我們可以說(shuō),CQL MERGE命令將新的節(jié)點(diǎn)添加到數(shù)據(jù)庫(kù),只有當(dāng)它不存在。

13.NULL值

Neo4j CQL將空值視為對(duì)節(jié)點(diǎn)或關(guān)系的屬性的缺失值或未定義值。

當(dāng)我們創(chuàng)建一個(gè)具有現(xiàn)有節(jié)點(diǎn)標(biāo)簽名稱(chēng)但未指定其屬性值的節(jié)點(diǎn)時(shí),它將創(chuàng)建一個(gè)具有NULL屬性值的新節(jié)點(diǎn)。

讓我們用一個(gè)例子來(lái)看這個(gè)。MATCH (e:Employee)  WHERE e.id IS NOT NULL RETURN e.id,e.name,e.sal,e.deptno

提供了一個(gè)WHERE子句來(lái)過(guò)濾該行,即Id屬性不應(yīng)該包含NULL值。MATCH (e:Employee)  WHERE e.id IS NULL RETURN e.id,e.name,e.sal,e.deptno

這里我們使用IS操作符來(lái)僅返回NULL行。

14.IN操作符

與SQL一樣,Neo4j CQL提供了一個(gè)IN運(yùn)算符,以便為CQL命令提供值的集合。

IN操作符語(yǔ)法IN[]

它是由逗號(hào)運(yùn)算符分隔的值的集合。

示例MATCH (e:Employee)  WHERE e.id IN [123,124] RETURN e.id,e.name,e.sal,e.deptno

15.INDEX索引

Neo4j SQL支持節(jié)點(diǎn)或關(guān)系屬性上的索引,以提高應(yīng)用程序的性能。

我們可以為具有相同標(biāo)簽名稱(chēng)的所有節(jié)點(diǎn)的屬性創(chuàng)建索引。

我們可以在MATCH或WHERE或IN運(yùn)算符上使用這些索引列來(lái)改進(jìn)CQL Command的執(zhí)行。

Neo4J索引操作

Create Index 創(chuàng)建索引

Drop Index 丟棄索引

我們將在本章中用示例來(lái)討論這些操作。

創(chuàng)建索引的語(yǔ)法:CREATE INDEX ON : ()

注意:-

冒號(hào)(:)運(yùn)算符用于引用節(jié)點(diǎn)或關(guān)系標(biāo)簽名稱(chēng)。

上述語(yǔ)法描述它在節(jié)點(diǎn)或關(guān)系的的上創(chuàng)建一個(gè)新索引。

示例CREATE INDEX ON :Customer (name)

刪除索引的語(yǔ)法:DROP INDEX ON : ()

示例DROP INDEX ON :Customer (name)

16.UNIQUE約束

在Neo4j數(shù)據(jù)庫(kù)中,CQL CREATE命令始終創(chuàng)建新的節(jié)點(diǎn)或關(guān)系,這意味著即使您使用相同的值,它也會(huì)插入一個(gè)新行。 根據(jù)我們對(duì)某些節(jié)點(diǎn)或關(guān)系的應(yīng)用需求,我們必須避免這種重復(fù)。 然后我們不能直接得到這個(gè)。 我們應(yīng)該使用一些數(shù)據(jù)庫(kù)約束來(lái)創(chuàng)建節(jié)點(diǎn)或關(guān)系的一個(gè)或多個(gè)屬性的規(guī)則。

像SQL一樣,Neo4j數(shù)據(jù)庫(kù)也支持對(duì)NODE或Relationship的屬性的UNIQUE約束

UNIQUE約束的優(yōu)點(diǎn)

避免重復(fù)記錄。

強(qiáng)制執(zhí)行數(shù)據(jù)完整性規(guī)則

創(chuàng)建唯一約束語(yǔ)法CREATE CONSTRAINT ON () ASSERT  IS UNIQUE

語(yǔ)法說(shuō)明:

S.No.

語(yǔ)法元素

描述

1。

CREATE CONSTRAINT ON

它是一個(gè)Neo4j CQL關(guān)鍵字。

2。

它是節(jié)點(diǎn)或關(guān)系的標(biāo)簽名稱(chēng)。

3。

ASSERT

它是一個(gè)Neo4j CQL關(guān)鍵字。

4。

它是節(jié)點(diǎn)或關(guān)系的屬性名稱(chēng)。

5。

IS UNIQUE

它是一個(gè)Neo4j CQL關(guān)鍵字,通知Neo4j數(shù)據(jù)庫(kù)服務(wù)器創(chuàng)建一個(gè)唯一約束。

注意:-

上述語(yǔ)法描述了只需要 節(jié)點(diǎn)或關(guān)系就可以創(chuàng)造一個(gè)獨(dú)特的約束。

示例CREATE CONSTRAINT ON (cc:CreditCard) ASSERT cc.number IS UNIQUE

注意

如果創(chuàng)建約束時(shí)節(jié)點(diǎn)屬性有重復(fù)值,Neo4j DB服務(wù)器將會(huì)拋出一個(gè)錯(cuò)誤,表示無(wú)法創(chuàng)建。

刪除UNIQUE約束語(yǔ)法:DROP CONSTRAINT ON () ASSERT  IS UNIQUE

示例DROP CONSTRAINT ON (cc:CreditCard) ASSERT cc.number IS UNIQUE

17.DISTINCT獨(dú)特

這個(gè)函數(shù)的用法就像SQL中的distinct關(guān)鍵字,返回的是所有不同值。

示例

MATCH (n:Movie) RETURN Distinct(n.name)

返回的是

第五章:解釋

1.圖形字體

關(guān)于Neo4j提供的圖形瀏覽器,我們可以從其中查看節(jié)點(diǎn)的屬性,或者改變其中的節(jié)點(diǎn)的大小顏色。

2.ID屬性

在Neo4j中,“Id”是節(jié)點(diǎn)和關(guān)系的默認(rèn)內(nèi)部屬性。 這意味著,當(dāng)我們創(chuàng)建一個(gè)新的節(jié)點(diǎn)或關(guān)系時(shí),Neo4j數(shù)據(jù)庫(kù)服務(wù)器將為內(nèi)部使用分配一個(gè)數(shù)字。 它會(huì)自動(dòng)遞增。

我們從一個(gè)例子去看:

新增一個(gè)節(jié)點(diǎn)CREATE (tweet:Tweet{message:"Hello"})

查看該節(jié)點(diǎn)MATCH (n:Tweet) RETURN n

3.Caption標(biāo)題

所謂的Caption標(biāo)題,就是更改Neo4j瀏覽器的節(jié)點(diǎn)顯示的文字(圓圈內(nèi)部)。比如

我們點(diǎn)擊下圖所示:

圓圈內(nèi)部變?yōu)榱薸d值。

第六章:函數(shù)

1.字符串函數(shù)

與SQL一樣,Neo4J CQL提供了一組String函數(shù),用于在CQL查詢(xún)中獲取所需的結(jié)果。

這里我們將討論一些重要的和經(jīng)常使用的功能。

字符串函數(shù)列表

S.No.

功能

描述

1。

UPPER

它用于將所有字母更改為大寫(xiě)字母。

2。

LOWER

它用于將所有字母改為小寫(xiě)字母。

3。

SUBSTRING

它用于獲取給定String的子字符串。

4。

REPLACE

它用于替換一個(gè)字符串的子字符串。

注意:所有CQL函數(shù)應(yīng)使用“()”括號(hào)。

現(xiàn)在我們將通過(guò)示例詳細(xì)討論每個(gè)Neo4J CQL字符串函數(shù)

1.UPPER

它需要一個(gè)字符串作為輸入并轉(zhuǎn)換為大寫(xiě)字母。 所有CQL函數(shù)應(yīng)使用“()”括號(hào)。

函數(shù)語(yǔ)法UPPER ()

注意:-

可以是來(lái)自Neo4J數(shù)據(jù)庫(kù)的節(jié)點(diǎn)或關(guān)系的屬性名稱(chēng)。

示例MATCH (e:Employee)  RETURN e.id,UPPER(e.name),e.sal,e.deptno

2.LOWER

它需要一個(gè)字符串作為輸入并轉(zhuǎn)換為小寫(xiě)字母。 所有CQL函數(shù)應(yīng)使用“()”括號(hào)。

函數(shù)語(yǔ)法LOWER ()

注意:-

可以是來(lái)自Neo4J數(shù)據(jù)庫(kù)的節(jié)點(diǎn)或關(guān)系的屬性名稱(chēng)MATCH (e:Employee)  RETURN e.id,LOWER(e.name),e.sal,e.deptno

3.SUBSTRING

它接受一個(gè)字符串作為輸入和兩個(gè)索引:一個(gè)是索引的開(kāi)始,另一個(gè)是索引的結(jié)束,并返回從StartInded到EndIndex-1的子字符串。 所有CQL函數(shù)應(yīng)使用“()”括號(hào)。

函數(shù)的語(yǔ)法SUBSTRING(, ,)

注意:-

在Neo4J CQL中,如果一個(gè)字符串包含n個(gè)字母,則它的長(zhǎng)度為n,索引從0開(kāi)始,到n-1結(jié)束。

是SUBSTRING函數(shù)的索引值。

是可選的。 如果我們省略它,那么它返回給定字符串的子串從startIndex到字符串的結(jié)尾。

示例MATCH (e:Employee)  RETURN e.id,SUBSTRING(e.name,0,2),e.sal,e.deptno

2.AGGREGATION聚合

和SQL一樣,Neo4j CQL提供了一些在RETURN子句中使用的聚合函數(shù)。 它類(lèi)似于SQL中的GROUP BY子句。

我們可以使用MATCH命令中的RETURN +聚合函數(shù)來(lái)處理一組節(jié)點(diǎn)并返回一些聚合值。

聚合函數(shù)列表

S.No.

聚集功能

描述

1。

COUNT

它返回由MATCH命令返回的行數(shù)。

2。

MAX

它從MATCH命令返回的一組行返回最大值。

3。

MIN

它返回由MATCH命令返回的一組行的最小值。

4。

SUM

它返回由MATCH命令返回的所有行的求和值。

5。

AVG

它返回由MATCH命令返回的所有行的平均值。

現(xiàn)在我們將通過(guò)示例詳細(xì)討論每個(gè)Neo4j CQL AGGREGATION函數(shù)

計(jì)數(shù)

它從MATCH子句獲取結(jié)果,并計(jì)算結(jié)果中出現(xiàn)的行數(shù),并返回該計(jì)數(shù)值。 所有CQL函數(shù)應(yīng)使用“()”括號(hào)。

函數(shù)語(yǔ)法COUNT()

注意 -

可以是*,節(jié)點(diǎn)或關(guān)系標(biāo)簽名稱(chēng)或?qū)傩悦Q(chēng)。

示例MATCH (e:Employee) RETURN COUNT(*)

MAX

它采用一組行和節(jié)點(diǎn)或關(guān)系的作為輸入,并從給定行的give 列中查找最小值。

函數(shù)語(yǔ)法MAX( )

MIN

它采用一組行和節(jié)點(diǎn)或關(guān)系的作為輸入,并從給定行的give 列中查找最小值。

函數(shù)語(yǔ)法MIN( )

注意 -

應(yīng)該是節(jié)點(diǎn)或關(guān)系的名稱(chēng)。

讓我們用一個(gè)例子看看MAX和MIN的功能。

示例MATCH (e:Employee)  RETURN MAX(e.sal),MIN(e.sal)

AVG

它采用一組行和節(jié)點(diǎn)或關(guān)系的作為輸入,并從給定行的give 列中查找平均值。

函數(shù)的語(yǔ)法AVG( )

SUM

它采用一組行和節(jié)點(diǎn)或關(guān)系的作為輸入,并從給定行的give 列中查找求和值。

函數(shù)的語(yǔ)法SUM( )

讓我們用一個(gè)例子來(lái)檢查SUM和AVG函數(shù)。MATCH (e:Employee)  RETURN SUM(e.sal),AVG(e.sal)

此命令從數(shù)據(jù)庫(kù)中可用的所有Employee節(jié)點(diǎn)查找總和平均值.

3.關(guān)系函數(shù)

Neo4j CQL提供了一組關(guān)系函數(shù),以在獲取開(kāi)始節(jié)點(diǎn),結(jié)束節(jié)點(diǎn)等細(xì)節(jié)時(shí)知道關(guān)系的細(xì)節(jié)。

關(guān)系函數(shù)列表

S.No.

功能

描述

1。

STARTNODE

它用于知道關(guān)系的開(kāi)始節(jié)點(diǎn)。

2。

ENDNODE

它用于知道關(guān)系的結(jié)束節(jié)點(diǎn)。

3。

ID

它用于知道關(guān)系的ID。

4。

TYPE

它用于知道字符串表示中的一個(gè)關(guān)系的TYPE。

現(xiàn)在我們將通過(guò)示例詳細(xì)討論每個(gè)Neo4j CQL關(guān)系函數(shù)

STARTNODE

它需要一個(gè)字符串作為輸入并轉(zhuǎn)換為大寫(xiě)字母。 所有CQL函數(shù)應(yīng)使用“()”括號(hào)。

函數(shù)語(yǔ)法STARTNODE ()

注意:-

可以是來(lái)自Neo4j數(shù)據(jù)庫(kù)的節(jié)點(diǎn)或關(guān)系的屬性名稱(chēng)。

示例MATCH (a)-[movie:ACTION_MOVIES]->(b)  RETURN STARTNODE(movie)

ENDNODEMATCH (a)-[movie:ACTION_MOVIES]->(b)  RETURN ENDNODE(movie)

ID TYPEMATCH (a)-[movie:ACTION_MOVIES]->(b)  RETURN ID(movie),TYPE(movie)

第七章:管理員

1.數(shù)據(jù)庫(kù)備份

在對(duì)Neo4j數(shù)據(jù)進(jìn)行備份、還原、遷移的操作時(shí),首先要關(guān)閉neo4j;cd %NEO4J_HOME%/bin./neo4j stop

數(shù)據(jù)備份到文件./neo4j-admin  dump --database=graph.db --to=/home/2018.dump

之后,進(jìn)行數(shù)據(jù)還原,將生成的存儲(chǔ)文件拷貝到另一個(gè)相同版本的環(huán)境中。

2.數(shù)據(jù)庫(kù)恢復(fù)

還原、遷移之前 ,關(guān)閉neo4j服務(wù)。操作同上;

數(shù)據(jù)導(dǎo)入:./neo4j-admin load --from=/home/2016-10-02.dump --database=graph.db --force

重啟服務(wù):./neo4j start

第八章:Spring Data Neo4j

1.簡(jiǎn)單介紹

Neo4j提供JAVA API以編程方式執(zhí)行所有數(shù)據(jù)庫(kù)操作。

具體Neo4j如何在原生Java程序編程,以及與Spring的集成,本章暫不討論。

Spring數(shù)據(jù)模塊的優(yōu)點(diǎn):

消除DAO層中的boiler plate代碼

DAO層中的工件少

易于開(kāi)發(fā)和維護(hù)

改進(jìn)開(kāi)發(fā)過(guò)程

Spring數(shù)據(jù)模塊功能:

支持基于XML的實(shí)體映射

支持基于注釋的實(shí)體映射

支持分頁(yè)

支持事務(wù)

更少的DAO層工件 - 實(shí)現(xiàn)存儲(chǔ)庫(kù)

Spring DATA Neo4j模塊具有與上述相同的優(yōu)點(diǎn)和特點(diǎn)。

接下來(lái),我們將基于Spring Boot在IDEA上開(kāi)發(fā)Neo4j應(yīng)用程序,需要注意的是Springboot的版本

2.新建項(xiàng)目

我們選擇web和Neo4j兩個(gè)依賴(lài)即可,這里有必要說(shuō)一下,如果你是使用Spring boot2.0以上,在你創(chuàng)建項(xiàng)目完成后,啟動(dòng)程序會(huì)報(bào)錯(cuò):Caused by: java.lang.ClassNotFoundException: org.neo4j.ogm.drivers.http.driver.HttpDriver     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_111]     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_111]     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_111]     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_111]     at java.lang.Class.forName0(Native Method) ~[na:1.8.0_111]     at java.lang.Class.forName(Class.java:264) ~[na:1.8.0_111]     at org.neo4j.ogm.session.SessionFactory.newDriverInstance(SessionFactory.java:92) ~[neo4j-ogm-core-3.1.0.jar:3.1.0]     ... 45 common frames omitted

原因是缺少依賴(lài),解決方法是導(dǎo)入缺少的依賴(lài):                    org.neo4j            neo4j-ogm-http-driver        

如果你的Spring boot版本為1.5.x,那么你只需要spring-data-neo4j即可:                    org.springframework.boot            spring-boot-starter-data-neo4j        

3.節(jié)點(diǎn)與關(guān)系

新建節(jié)點(diǎn)類(lèi),id的屬性為L(zhǎng)ong而不能為long,還需要注意的是在Spring boot1.5中修飾id屬性的注釋為@GraphId,org.neo4j.ogm.annotation.Id不存在,效果一樣,都是Neo4j數(shù)據(jù)庫(kù)自動(dòng)創(chuàng)建的ID值。@NodeEntity(label = "Bot") public class BotNode {     @Id     @GeneratedValue     private Long id; //id     @Property(name = "name")     private String name;//名     @Property(name = "kind")     private String kind;//類(lèi)     @Property(name = "weight")     private long weight;//權(quán)重public BotNode() {}public BotNode(Long id, String name, String kind, long weight) {     this.id = id;     this.name = name;     this.kind = kind;     this.weight = weight;}public Long getId() {     return id;}public void setId(Long id) {     this.id = id;}public String getName() {     return name;}public void setName(String name) {     this.name = name;}public String getKind() {     return kind;}public void setKind(String kind) {     this.kind = kind;}public long getWeight() {     return weight;}public void setWeight(long weight) {     this.weight = weight;} @Overridepublic String toString() {     return "BotNode{" +             "id=" + id +             ", name='" + name + '\'' +             ", kind='" + kind + '\'' +             ", weight=" + weight +             '}';}}

新建節(jié)點(diǎn)關(guān)系類(lèi)

有必要說(shuō)明一下, @StartNode 和@EndNode注釋的類(lèi)可以不是同一個(gè)類(lèi)。@RelationshipEntity(type = "BotRelation") public class BotRelation { @Id @GeneratedValue private Long id; @StartNode private BotNode startNode; @EndNode private BotNode endNode; @Property private String relation;public BotRelation() {}public BotRelation(Long id, BotNode startNode, BotNode endNode, String relation) {     this.id = id;     this.startNode = startNode;     this.endNode = endNode;     this.relation = relation;}public String getRelation() {     return relation;}public void setRelation(String relation) {     this.relation = relation;}public Long getId() {     return id;}public void setId(Long id) {     this.id = id;}public BotNode getStartNode() {     return startNode;}public void setStartNode(BotNode startNode) {     this.startNode = startNode;}public BotNode getEndNode() {     return endNode;}public void setEndNode(BotNode endNode) {     this.endNode = endNode;} @Overridepublic String toString() {     return "BotRelation{" +             "id=" + id +             ", startNode=" + startNode +             ", endNode=" + endNode +             ", relation='" + relation + '\'' +             '}';}}

4.Repository

我們只需要使接口繼承Neo4jRepository就可以使用該接口提供的一些基礎(chǔ)的增刪改查方法。@Repository public interface BotRepository extends Neo4jRepository { BotNode findAllByName(String name);}

對(duì)于復(fù)雜的查詢(xún)我們可以參照上面講到的CQL語(yǔ)句執(zhí)行。@Repository public interface BotRelationRepository extends Neo4jRepository { //返回節(jié)點(diǎn)n以及n指向的所有節(jié)點(diǎn)與關(guān)系 @Query("MATCH p=(n:Bot)-[r:BotRelation]->(m:Bot) WHERE id(n)={0} RETURN p") List findAllByBotNode(BotNode botNode);//返回節(jié)點(diǎn)n以及n指向或指向n的所有節(jié)點(diǎn)與關(guān)系 @Query("MATCH p=(n:Bot)<-[r:BotRelation]->(m:Bot) WHERE m.name={name} RETURN p") List findAllBySymptom(@Param("name") String name);//返回節(jié)點(diǎn)n以及n指向或指向n的所有節(jié)點(diǎn)以及這些節(jié)點(diǎn)間的所有關(guān)系 @Query("MATCH p=(n:Bot)<-[r:BotRelation]->(m:Bot)<-[:BotRelation]->(:Bot)<-[:BotRelation]->(n:Bot) WHERE n.name={name} RETURN p") List findAllByStartNode(@Param("name") String name);}

5.單元測(cè)試

保存@RunWith(SpringRunner.class) @SpringBootTest public class Neo4jApplicationTests { @Autowired MovieRepository movieRepository;@Testpublic void contextLoads() {     movieRepository.save(new Movie("《奧特曼》"));     System.out.println(movieRepository.findAll());}}

查看打?。篬Movie{id=8183, name='《奧特曼》'}]

保存成功!

補(bǔ)充

如果想保存關(guān)系的話MedicalNode node = new MedicalNode(-1l,"節(jié)點(diǎn)","測(cè)試"); medicalNodeRepository.save(node); MedicalNode node1 = new MedicalNode(-1l,"節(jié)點(diǎn)","測(cè)試"); medicalNodeRepository.save(node1); medicalRelationRepository.save(new MedicalRelation(-1l,node,node1,"關(guān)系"));

更新

接下來(lái)我們測(cè)試更新數(shù)據(jù):    @Test public void updata(){ Movie movie = movieRepository.findAllById(8183l); movie.setName("《迪迦》"); movieRepository.save(movie); System.out.println(movieRepository.findAll()); }

執(zhí)行程序,報(bào)錯(cuò):java.lang.NullPointerException

我們看到程序執(zhí)行的CQL語(yǔ)句為:MATCH (n:Movie) WHERE n.id = { id_0 } WITH n RETURN n, ID(n)

然后我們?cè)贜eo4j瀏覽器控制臺(tái)執(zhí)行查詢(xún)語(yǔ)句:

這是為什么呢?在Neo4j中,根據(jù)Id查詢(xún)節(jié)點(diǎn)的語(yǔ)句為:MATCH (n:Movie) where id(n)=8183  RETURN n

我們修改Repository層的查詢(xún)方法:@Repository public interface MovieRepository extends Neo4jRepository { @Query("MATCH (n:Movie) where id(n)=  RETURN n") Movie findAllById(@Param("id") Long id); }

再次執(zhí)行更新程序,結(jié)果為:[Movie{id=8183, name='《迪迦》'}]

更新成功!

換句話說(shuō),只要掌握了CQL語(yǔ)句,就基本啥都會(huì)了~! 還有,本書(shū)并不代表全部的Neo4j知識(shí)。

附錄 neo4j.conf漢化版For more details and a complete list of settings, please see https:///docs/operations-manual/current/reference/configuration-settings/

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多