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/ |
|
來(lái)自: 遠(yuǎn)方 > 《知識(shí)圖譜》