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是一個高性能的,NOSQL圖形數(shù)據(jù)庫,它將結構化數(shù)據(jù)存儲在網(wǎng)絡上而不是表中。它是一個嵌入式的、基于磁盤的、具備完全的事務特性的Java持久化引擎,但是它將結構化數(shù)據(jù)存儲在網(wǎng)絡(從數(shù)學角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數(shù)據(jù)庫的所有特性。程序員工作在一個面向?qū)ο蟮?、靈活的網(wǎng)絡結構下而不是嚴格、靜態(tài)的表中——但是他們可以享受到具備完全的事務特性、企業(yè)級的數(shù)據(jù)庫的所有好處。 Neo4j的特點 SQL就像簡單的查詢語言Neo4j CQL 它遵循屬性圖數(shù)據(jù)模型 它通過使用Apache Lucence支持索引 它支持UNIQUE約束 它它包含一個用于執(zhí)行CQL命令的UI:Neo4j數(shù)據(jù)瀏覽器 它支持完整的ACID(原子性,一致性,隔離性和持久性)規(guī)則 它采用原生圖形庫與本地GPE(圖形處理引擎) 它支持查詢的數(shù)據(jù)導出到JSON和XLS格式 它提供了REST API,可以被任何編程語言(如Java,Spring,Scala等)訪問 它提供了可以通過任何UI MVC框架(如Node JS)訪問的Java腳本 它支持兩種Java API:Cypher API和Native Java API來開發(fā)Java應用程序 Neo4j的優(yōu)點 它很容易表示連接的數(shù)據(jù) 檢索/遍歷/導航更多的連接數(shù)據(jù)是非常容易和快速的 它非常容易地表示半結構化數(shù)據(jù) Neo4j CQL查詢語言命令是人性化的可讀格式,非常容易學習 它使用簡單而強大的數(shù)據(jù)模型 它不需要復雜的連接來檢索連接的/相關的數(shù)據(jù),因為它很容易檢索它的相鄰節(jié)點或關系細節(jié)沒有連接或索引 第二章:安裝 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.開啟遠程訪問 一、對于3.0以前的版本 在安裝目錄的 $NEO4J_HOME/conf/neo4j.conf 文件內(nèi),找到下面一行,將注釋#號去掉就可以了 #dbms.connector.https.address=localhost:7473 改為 dbms.connector.https.address=0.0.0.0:7473 這樣,遠程其他電腦可以用本機的IP或者域名后面跟上7474 端口就能打開web界面了 如: https://:7473 當然,你的操作系統(tǒng)的防火墻也要確保開放了7474端口才行,防火墻怎樣開放請自行針對自己的操作系統(tǒng)查找文檔 二、對于3.1及以后的版本 在安裝目錄的 $NEO4J_HOME/conf/neo4j.conf 文件內(nèi),找到下面一行,將注釋#號去掉就可以了 dbms.connectors.default_listen_address=0.0.0.0 4.測試 在bin目錄下,執(zhí)行命令:./neo4j start啟動,其他命令 { console | start | stop | restart | status } 訪問http://IP地址:7474/, 出現(xiàn)下圖即代表安裝成功,頂部的$輸入框用來執(zhí)行下面的CQL語句。 第三章:CQL 1.CQL簡介 CQL代表Cypher查詢語言。 像Oracle數(shù)據(jù)庫具有查詢語言SQL,Neo4j具有CQL作為查詢語言。 Neo4j CQL - 它是Neo4j圖形數(shù)據(jù)庫的查詢語言。 它是一種聲明性模式匹配語言 它遵循SQL語法。 它的語法是非常簡單且人性化、可讀的格式。 如Oracle SQL - Neo4j CQL 已命令來執(zhí)行數(shù)據(jù)庫操作。 Neo4j CQL 支持多個子句像在哪里,順序等,以非常簡單的方式編寫非常復雜的查詢。 NNeo4j CQL 支持一些功能,如字符串,Aggregation.In 加入他們,它還支持一些關系功能。 2.Neo4j CQL命令/條款 常用的Neo4j CQL命令/條款如下: S.No. CQL命令/條 用法 1。 CREATE 創(chuàng)建 創(chuàng)建節(jié)點,關系和屬性 2。 MATCH 匹配 檢索有關節(jié)點,關系和屬性數(shù)據(jù) 3。 RETURN 返回 返回查詢結果 4。 WHERE 哪里 提供條件過濾檢索數(shù)據(jù) 5。 DELETE 刪除 刪除節(jié)點和關系 6。 REMOVE 移除 刪除節(jié)點和關系的屬性 7。 ORDER BY以…排序 排序檢索數(shù)據(jù) 8。 SET 組 添加或更新標簽 3.Neo4j CQL 函數(shù) 以下是常用的Neo4j CQL函數(shù): S.No. 定制列表功能 用法 1。 String 字符串 它們用于使用String字面量。 2。 Aggregation 聚合 它們用于對CQL查詢結果執(zhí)行一些聚合操作。 3。 Relationship 關系 他們用于獲取關系的細節(jié),如startnode,endnode等。 我們將在后面的章節(jié)中詳細討論所有Neo4j CQL命令,子句和函數(shù)語法,用法和示例。 4.Neo4j CQL數(shù)據(jù)類型 這些數(shù)據(jù)類型與Java語言類似。 它們用于定義節(jié)點或關系的屬性 Neo4j CQL支持以下數(shù)據(jù)類型: S.No. CQL數(shù)據(jù)類型 用法 1. boolean 用于表示布爾文字:true,false。 2. byte 用于表示8位整數(shù)。 3. short 用于表示16位整數(shù)。 4. int 用于表示32位整數(shù)。 5. long 用于表示64位整數(shù)。 6. float I用于表示32位浮點數(shù)。 7. double 用于表示64位浮點數(shù)。 8. char 用于表示16位字符。 9. String 用于表示字符串。 第四章:命令 1.CREATE創(chuàng)建 Neo4j CQL創(chuàng)建一個沒有屬性的節(jié)點CREATE (:) 語法說明 規(guī)范說法是節(jié)點標簽名稱,其實相當于Mysql數(shù)據(jù)庫中的表名,而是節(jié)點名稱,其實代指創(chuàng)建的此行數(shù)據(jù)。 示例CREATE (emp:Employee) 或者CREATE (:Employee) Neo4j CQL創(chuàng)建具有屬性的節(jié)點 Neo4j CQL“CREATE”命令用于創(chuàng)建帶有屬性的節(jié)點。 它創(chuàng)建一個具有一些屬性(鍵值對)的節(jié)點來存儲數(shù)據(jù)。CREATE ( : { : ........ : } ) 示例CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" }) 創(chuàng)建多個標簽到節(jié)點 語法:CREATE (::.....:) 示例CREATE (m:Movie:Cinema:Film:Picture) 2.MATCH查詢 Neo4j CQL MATCH命令用于 從數(shù)據(jù)庫獲取有關節(jié)點和屬性的數(shù)據(jù) 從數(shù)據(jù)庫獲取有關節(jié)點,關系和屬性的數(shù)據(jù) MATCH命令語法:MATCH ( :) 示例MATCH (dept:Dept) 但是執(zhí)行后會報錯:Neo.ClientError.Statement.SyntaxError: Query cannot conclude with MATCH (must be RETURN or an update clause) (line 1, column 1 (offset: 0)) 如果你觀察到錯誤消息,它告訴我們,我們可以使用MATCH命令與RETURN子句或UPDATA子句。 3.RETURN返回 Neo4j CQL RETURN子句用于 - 檢索節(jié)點的某些屬性 檢索節(jié)點的所有屬性 檢索節(jié)點和關聯(lián)關系的某些屬性 檢索節(jié)點和關聯(lián)關系的所有屬性 RETURN命令語法:RETURN ., ........ . 示例MATCH (e:Employee) RETURN e 或MATCH (dept: Dept) RETURN dept.deptno,dept.dname,dept.location 4.關系基礎 Neo4j圖數(shù)據(jù)庫遵循屬性圖模型來存儲和管理其數(shù)據(jù)。 根據(jù)屬性圖模型,關系應該是定向的。 否則,Neo4j將拋出一個錯誤消息。 基于方向性,Neo4j關系被分為兩種主要類型。 單向關系 雙向關系 使用新節(jié)點創(chuàng)建關系 示例CREATE (e:Employee)-[r:DemoRelation]->(c:Employee) 這句會創(chuàng)建節(jié)點e,節(jié)點c,以及e -> c的關系r,這里需要注意方向,比如雙向是CREATE (e:Employee)<-[r:DemoRelation]->(c:Employee) 使用已知節(jié)點創(chuàng)建帶屬性的關系:MATCH (:),(:) CREATE ()-[: {}]->() RETURN 還是一系列鍵值對 示例MATCH (cust:Customer),(cc:CreditCard) CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc) RETURN r 檢索關系節(jié)點的詳細信息:MATCH ()-[:]->() RETURN 示例MATCH (cust)-[r:DO_SHOPPING_WITH]->(cc) RETURN cust,cc 5.WHERE子句 像SQL一樣,Neo4j CQL在CQL MATCH命令中提供了WHERE子句來過濾MATCH查詢的結果。 簡單WHERE子句語法WHERE 語法說明: S.No. 語法元素 描述 1 WHERE 它是一個Neo4j CQL關鍵字。 2 <屬性名稱> 它是節(jié)點或關系的屬性名稱。 3 <比較運算符> 它是Neo4j CQL比較運算符之一。 4 <值> 它是一個字面值,如數(shù)字文字,字符串文字等。 Neo4j CQL中的比較運算符 Neo4j 支持以下的比較運算符,在 Neo4j CQL WHERE 子句中使用來支持條件 S.No. 布爾運算符 描述 1. = 它是Neo4j CQL“等于”運算符。 2. <> 它是一個Neo4j CQL“不等于”運算符。 3. < 它是一個Neo4j CQL“小于”運算符。 4. > 它是一個Neo4j CQL“大于”運算符。 5. <= 它是一個Neo4j CQL“小于或等于”運算符。 6. = 它是一個Neo4j CQL“大于或等于”運算符。 我們可以使用布爾運算符在同一命令上放置多個條件。 Neo4j CQL中的布爾運算符 Neo4j支持以下布爾運算符在Neo4j CQL WHERE子句中使用以支持多個條件。 S.No. 布爾運算符 描述 1 AND 它是一個支持AND操作的Neo4j CQL關鍵字。 2 OR 它是一個Neo4j CQL關鍵字來支持OR操作。 3 NOT 它是一個Neo4j CQL關鍵字支持NOT操作。 4 XOR 它是一個支持XOR操作的Neo4j CQL關鍵字。 示例MATCH (emp:Employee) WHERE emp.name = 'Abc' OR emp.name = 'Xyz' RETURN emp 利用WHERE創(chuàng)建指定關系節(jié)點: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 有必要補充一下,可以不使用WHERE達到WHERE的一些效果,比如MATCH p=(m:Bot{id:123})<-[:BotRelation]->(:Bot) RETURN p 6.DELETE刪除 Neo4j使用CQL DELETE子句 刪除節(jié)點。 刪除節(jié)點及相關節(jié)點和關系。 DELETE節(jié)點子句語法DELETE 示例MATCH (e: Employee) DELETE e DELETE節(jié)點和關系子句語法DELETE ,, 示例MATCH (cc: CreditCard)-[rel]-(c:Customer) DELETE cc,c,rel 7.REMOVE刪除 有時基于我們的客戶端要求,我們需要向現(xiàn)有節(jié)點或關系添加或刪除屬性。 我們使用Neo4j CQL SET子句向現(xiàn)有節(jié)點或關系添加新屬性。 我們使用Neo4j CQL REMOVE子句來刪除節(jié)點或關系的現(xiàn)有屬性。 Neo4j CQL REMOVE命令用于 刪除節(jié)點或關系的標簽 刪除節(jié)點或關系的屬性 Neo4j CQL DELETE和REMOVE命令之間的主要區(qū)別 - DELETE操作用于刪除節(jié)點和關聯(lián)關系。 REMOVE操作用于刪除標簽和屬性。 Neo4j CQL DELETE和REMOVE命令之間的相似性 - 這兩個命令不應單獨使用。 兩個命令都應該與MATCH命令一起使用。 1.REMOVE屬性子句語法REMOVE .,. 語法說明: S.No. 語法元素 描述 1。 它是節(jié)點的名稱。 2。 它是節(jié)點的屬性名稱。 示例 這里我們可以觀察到DebitCard節(jié)點包含6個屬性。 在數(shù)據(jù)瀏覽器上鍵入以下命令刪除cvv屬性MATCH (dc:DebitCard) REMOVE dc.cvv RETURN dc 2.REMOVE一個Label子句語法:REMOVE S.No. 語法元素 描述 1. REMOVE 它是一個Neo4j CQL關鍵字。 2. 它是一個標簽列表,用于永久性地從節(jié)點或關系中刪除它。 語法:, .... : 示例 1.我們創(chuàng)建一個含有兩個標簽的節(jié)點:CREATE (m:Movie:Pic) 2.查詢該節(jié)點MATCH (n:Movie) RETURN n 3.刪除標簽MATCH (m:Movie) REMOVE m:Pic 4.再次查詢 8.SET子句 有時,根據(jù)我們的客戶端要求,我們需要向現(xiàn)有節(jié)點或關系添加新屬性。 要做到這一點,Neo4j CQL提供了一個SET子句。 Neo4j CQL已提供SET子句來執(zhí)行以下操作。 向現(xiàn)有節(jié)點或關系添加新屬性 添加或更新屬性值 SET子句語法SET .,.... 語法說明: S.No. 語法元素 描述 1 <節(jié)點標簽名稱> 這是一個節(jié)點的標簽名稱。 2 <屬性名稱> 它是一個節(jié)點的屬性名。 示例MATCH (dc:DebitCard) SET dc.atm_pin = 3456 RETURN dc 9.ORDER BY排序 Neo4j CQL ORDER BY子句 Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,對MATCH查詢返回的結果進行排序。 我們可以按升序或降序?qū)π羞M行排序。 默認情況下,它按升序?qū)π羞M行排序。 如果我們要按降序?qū)λ鼈冞M行排序,我們需要使用DESC子句。 ORDER BY子句語法ORDER BY [DESC] 語法:.,., .... . S.No. 語法元素 描述 1。 它是節(jié)點的標簽名稱。 2。 它是節(jié)點的屬性名稱。 示例MATCH (emp:Employee) RETURN emp.empid,emp.name,emp.salary,emp.deptno ORDER BY emp.name 10.UNION子句 與SQL一樣,Neo4j CQL有兩個子句,將兩個不同的結果合并成一組結果 UNION UNION ALL UNION子句 它將兩組結果中的公共行組合并返回到一組結果中。 它不從兩個節(jié)點返回重復的行。 限制: 結果列類型和來自兩組結果的名稱必須匹配,這意味著列名稱應該相同,列的數(shù)據(jù)類型應該相同。 UNION子句語法 UNION S.No. 語法元素 描述 1。 它是CQL MATCH命令,由UNION子句使用。 2。 它是CQL MATCH命令兩個由UNION子句使用。 3。 UNION 它是UNION子句的Neo4j CQL關鍵字。 注意 - 如果這兩個查詢不返回相同的列名和數(shù)據(jù)類型,那么它拋出一個錯誤。 示例MATCH (cc:CreditCard) RETURN cc.id,cc.number UNION MATCH (dc:DebitCard) RETURN dc.id,dc.number UNION ALL子句 它結合并返回兩個結果集的所有行成一個單一的結果集。它還返回由兩個節(jié)點重復行。 限制 結果列類型,并從兩個結果集的名字必須匹配,這意味著列名稱應該是相同的,列的數(shù)據(jù)類型應該是相同的。 UNION ALL子句語法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來過濾或限制查詢返回的行數(shù)。 簡單來說:LIMIT返回前幾行,SKIP返回后幾行。 LIMIT 示例MATCH (emp:Employee) RETURN emp LIMIT 2 它只返回Top的兩個結果,因為我們定義了limit = 2。這意味著前兩行。 SKIP示例MATCH (emp:Employee) RETURN emp SKIP 2 它只返回來自Bottom的兩個結果,因為我們定義了skip = 2。這意味著最后兩行。 12.MERGE命令 Neo4j使用CQL MERGE命令 - 創(chuàng)建節(jié)點,關系和屬性 為從數(shù)據(jù)庫檢索數(shù)據(jù) MERGE命令是CREATE命令和MATCH命令的組合。MERGE = CREATE + MATCH Neo4j CQL MERGE命令在圖中搜索給定模式,如果存在,則返回結果 如果它不存在于圖中,則它創(chuàng)建新的節(jié)點/關系并返回結果。 Neo4j CQL MERGE語法MERGE (:{ :<1-Value> ..... :}) 注意 - Neo4j CQL MERGE命令語法與CQL CREATE命令類似。 我們將使用這兩個命令執(zhí)行以下操作 - 創(chuàng)建具有一個屬性的配置文件節(jié)點:Id,名稱 創(chuàng)建具有相同屬性的同一個Profile節(jié)點:Id,Name 檢索所有Profile節(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 如果我們觀察上面的查詢結果,它只顯示一行,因為CQL MERGE命令檢查該節(jié)點在數(shù)據(jù)庫中是否可用。 如果它不存在,它創(chuàng)建新節(jié)點。 否則,它不創(chuàng)建新的。 通過觀察這些結果,我們可以說,CQL MERGE命令將新的節(jié)點添加到數(shù)據(jù)庫,只有當它不存在。 13.NULL值 Neo4j CQL將空值視為對節(jié)點或關系的屬性的缺失值或未定義值。 當我們創(chuàng)建一個具有現(xiàn)有節(jié)點標簽名稱但未指定其屬性值的節(jié)點時,它將創(chuàng)建一個具有NULL屬性值的新節(jié)點。 讓我們用一個例子來看這個。MATCH (e:Employee) WHERE e.id IS NOT NULL RETURN e.id,e.name,e.sal,e.deptno 提供了一個WHERE子句來過濾該行,即Id屬性不應該包含NULL值。MATCH (e:Employee) WHERE e.id IS NULL RETURN e.id,e.name,e.sal,e.deptno 這里我們使用IS操作符來僅返回NULL行。 14.IN操作符 與SQL一樣,Neo4j CQL提供了一個IN運算符,以便為CQL命令提供值的集合。 IN操作符語法IN[] 它是由逗號運算符分隔的值的集合。 示例MATCH (e:Employee) WHERE e.id IN [123,124] RETURN e.id,e.name,e.sal,e.deptno 15.INDEX索引 Neo4j SQL支持節(jié)點或關系屬性上的索引,以提高應用程序的性能。 我們可以為具有相同標簽名稱的所有節(jié)點的屬性創(chuàng)建索引。 我們可以在MATCH或WHERE或IN運算符上使用這些索引列來改進CQL Command的執(zhí)行。 Neo4J索引操作 Create Index 創(chuàng)建索引 Drop Index 丟棄索引 我們將在本章中用示例來討論這些操作。 創(chuàng)建索引的語法:CREATE INDEX ON : () 注意:- 冒號(:)運算符用于引用節(jié)點或關系標簽名稱。 上述語法描述它在節(jié)點或關系的的上創(chuàng)建一個新索引。 示例CREATE INDEX ON :Customer (name) 刪除索引的語法:DROP INDEX ON : () 示例DROP INDEX ON :Customer (name) 16.UNIQUE約束 在Neo4j數(shù)據(jù)庫中,CQL CREATE命令始終創(chuàng)建新的節(jié)點或關系,這意味著即使您使用相同的值,它也會插入一個新行。 根據(jù)我們對某些節(jié)點或關系的應用需求,我們必須避免這種重復。 然后我們不能直接得到這個。 我們應該使用一些數(shù)據(jù)庫約束來創(chuàng)建節(jié)點或關系的一個或多個屬性的規(guī)則。 像SQL一樣,Neo4j數(shù)據(jù)庫也支持對NODE或Relationship的屬性的UNIQUE約束 UNIQUE約束的優(yōu)點 避免重復記錄。 強制執(zhí)行數(shù)據(jù)完整性規(guī)則 創(chuàng)建唯一約束語法CREATE CONSTRAINT ON () ASSERT IS UNIQUE 語法說明: S.No. 語法元素 描述 1。 CREATE CONSTRAINT ON 它是一個Neo4j CQL關鍵字。 2。 它是節(jié)點或關系的標簽名稱。 3。 ASSERT 它是一個Neo4j CQL關鍵字。 4。 它是節(jié)點或關系的屬性名稱。 5。 IS UNIQUE 它是一個Neo4j CQL關鍵字,通知Neo4j數(shù)據(jù)庫服務器創(chuàng)建一個唯一約束。 注意:- 上述語法描述了只需要 節(jié)點或關系就可以創(chuàng)造一個獨特的約束。 示例CREATE CONSTRAINT ON (cc:CreditCard) ASSERT cc.number IS UNIQUE 注意 如果創(chuàng)建約束時節(jié)點屬性有重復值,Neo4j DB服務器將會拋出一個錯誤,表示無法創(chuàng)建。 刪除UNIQUE約束語法:DROP CONSTRAINT ON () ASSERT IS UNIQUE 示例DROP CONSTRAINT ON (cc:CreditCard) ASSERT cc.number IS UNIQUE 17.DISTINCT獨特 這個函數(shù)的用法就像SQL中的distinct關鍵字,返回的是所有不同值。 示例 MATCH (n:Movie) RETURN Distinct(n.name) 返回的是 第五章:解釋 1.圖形字體 關于Neo4j提供的圖形瀏覽器,我們可以從其中查看節(jié)點的屬性,或者改變其中的節(jié)點的大小顏色。 2.ID屬性 在Neo4j中,“Id”是節(jié)點和關系的默認內(nèi)部屬性。 這意味著,當我們創(chuàng)建一個新的節(jié)點或關系時,Neo4j數(shù)據(jù)庫服務器將為內(nèi)部使用分配一個數(shù)字。 它會自動遞增。 我們從一個例子去看: 新增一個節(jié)點CREATE (tweet:Tweet{message:"Hello"}) 查看該節(jié)點MATCH (n:Tweet) RETURN n 3.Caption標題 所謂的Caption標題,就是更改Neo4j瀏覽器的節(jié)點顯示的文字(圓圈內(nèi)部)。比如 我們點擊下圖所示: ![]() 圓圈內(nèi)部變?yōu)榱薸d值。 第六章:函數(shù) 1.字符串函數(shù) 與SQL一樣,Neo4J CQL提供了一組String函數(shù),用于在CQL查詢中獲取所需的結果。 這里我們將討論一些重要的和經(jīng)常使用的功能。 字符串函數(shù)列表 S.No. 功能 描述 1。 UPPER 它用于將所有字母更改為大寫字母。 2。 LOWER 它用于將所有字母改為小寫字母。 3。 SUBSTRING 它用于獲取給定String的子字符串。 4。 REPLACE 它用于替換一個字符串的子字符串。 注意:所有CQL函數(shù)應使用“()”括號。 現(xiàn)在我們將通過示例詳細討論每個Neo4J CQL字符串函數(shù) 1.UPPER 它需要一個字符串作為輸入并轉(zhuǎn)換為大寫字母。 所有CQL函數(shù)應使用“()”括號。 函數(shù)語法UPPER () 注意:- 可以是來自Neo4J數(shù)據(jù)庫的節(jié)點或關系的屬性名稱。 示例MATCH (e:Employee) RETURN e.id,UPPER(e.name),e.sal,e.deptno 2.LOWER 它需要一個字符串作為輸入并轉(zhuǎn)換為小寫字母。 所有CQL函數(shù)應使用“()”括號。 函數(shù)語法LOWER () 注意:- 可以是來自Neo4J數(shù)據(jù)庫的節(jié)點或關系的屬性名稱MATCH (e:Employee) RETURN e.id,LOWER(e.name),e.sal,e.deptno 3.SUBSTRING 它接受一個字符串作為輸入和兩個索引:一個是索引的開始,另一個是索引的結束,并返回從StartInded到EndIndex-1的子字符串。 所有CQL函數(shù)應使用“()”括號。 函數(shù)的語法SUBSTRING(, ,) 注意:- 在Neo4J CQL中,如果一個字符串包含n個字母,則它的長度為n,索引從0開始,到n-1結束。 是SUBSTRING函數(shù)的索引值。 是可選的。 如果我們省略它,那么它返回給定字符串的子串從startIndex到字符串的結尾。 示例MATCH (e:Employee) RETURN e.id,SUBSTRING(e.name,0,2),e.sal,e.deptno 2.AGGREGATION聚合 和SQL一樣,Neo4j CQL提供了一些在RETURN子句中使用的聚合函數(shù)。 它類似于SQL中的GROUP BY子句。 我們可以使用MATCH命令中的RETURN +聚合函數(shù)來處理一組節(jié)點并返回一些聚合值。 聚合函數(shù)列表 S.No. 聚集功能 描述 1。 COUNT 它返回由MATCH命令返回的行數(shù)。 2。 MAX 它從MATCH命令返回的一組行返回最大值。 3。 MIN 它返回由MATCH命令返回的一組行的最小值。 4。 SUM 它返回由MATCH命令返回的所有行的求和值。 5。 AVG 它返回由MATCH命令返回的所有行的平均值。 現(xiàn)在我們將通過示例詳細討論每個Neo4j CQL AGGREGATION函數(shù) 計數(shù) 它從MATCH子句獲取結果,并計算結果中出現(xiàn)的行數(shù),并返回該計數(shù)值。 所有CQL函數(shù)應使用“()”括號。 函數(shù)語法COUNT() 注意 - 可以是*,節(jié)點或關系標簽名稱或?qū)傩悦Q。 示例MATCH (e:Employee) RETURN COUNT(*) MAX 它采用一組行和節(jié)點或關系的作為輸入,并從給定行的give 列中查找最小值。 函數(shù)語法MAX( ) MIN 它采用一組行和節(jié)點或關系的作為輸入,并從給定行的give 列中查找最小值。 函數(shù)語法MIN( ) 注意 - 應該是節(jié)點或關系的名稱。 讓我們用一個例子看看MAX和MIN的功能。 示例MATCH (e:Employee) RETURN MAX(e.sal),MIN(e.sal) AVG 它采用一組行和節(jié)點或關系的作為輸入,并從給定行的give 列中查找平均值。 函數(shù)的語法AVG( ) SUM 它采用一組行和節(jié)點或關系的作為輸入,并從給定行的give 列中查找求和值。 函數(shù)的語法SUM( ) 讓我們用一個例子來檢查SUM和AVG函數(shù)。MATCH (e:Employee) RETURN SUM(e.sal),AVG(e.sal) 此命令從數(shù)據(jù)庫中可用的所有Employee節(jié)點查找總和平均值. 3.關系函數(shù) Neo4j CQL提供了一組關系函數(shù),以在獲取開始節(jié)點,結束節(jié)點等細節(jié)時知道關系的細節(jié)。 關系函數(shù)列表 S.No. 功能 描述 1。 STARTNODE 它用于知道關系的開始節(jié)點。 2。 ENDNODE 它用于知道關系的結束節(jié)點。 3。 ID 它用于知道關系的ID。 4。 TYPE 它用于知道字符串表示中的一個關系的TYPE。 現(xiàn)在我們將通過示例詳細討論每個Neo4j CQL關系函數(shù) STARTNODE 它需要一個字符串作為輸入并轉(zhuǎn)換為大寫字母。 所有CQL函數(shù)應使用“()”括號。 函數(shù)語法STARTNODE () 注意:- 可以是來自Neo4j數(shù)據(jù)庫的節(jié)點或關系的屬性名稱。 示例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ù)庫備份 在對Neo4j數(shù)據(jù)進行備份、還原、遷移的操作時,首先要關閉neo4j;cd %NEO4J_HOME%/bin./neo4j stop 數(shù)據(jù)備份到文件./neo4j-admin dump --database=graph.db --to=/home/2018.dump 之后,進行數(shù)據(jù)還原,將生成的存儲文件拷貝到另一個相同版本的環(huán)境中。 2.數(shù)據(jù)庫恢復 還原、遷移之前 ,關閉neo4j服務。操作同上; 數(shù)據(jù)導入:./neo4j-admin load --from=/home/2016-10-02.dump --database=graph.db --force 重啟服務:./neo4j start 第八章:Spring Data Neo4j 1.簡單介紹 Neo4j提供JAVA API以編程方式執(zhí)行所有數(shù)據(jù)庫操作。 具體Neo4j如何在原生Java程序編程,以及與Spring的集成,本章暫不討論。 Spring數(shù)據(jù)模塊的優(yōu)點: 消除DAO層中的boiler plate代碼 DAO層中的工件少 易于開發(fā)和維護 改進開發(fā)過程 Spring數(shù)據(jù)模塊功能: 支持基于XML的實體映射 支持基于注釋的實體映射 支持分頁 支持事務 更少的DAO層工件 - 實現(xiàn)存儲庫 Spring DATA Neo4j模塊具有與上述相同的優(yōu)點和特點。 接下來,我們將基于Spring Boot在IDEA上開發(fā)Neo4j應用程序,需要注意的是Springboot的版本 2.新建項目 我們選擇web和Neo4j兩個依賴即可,這里有必要說一下,如果你是使用Spring boot2.0以上,在你創(chuàng)建項目完成后,啟動程序會報錯: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 原因是缺少依賴,解決方法是導入缺少的依賴: org.neo4j neo4j-ogm-http-driver 如果你的Spring boot版本為1.5.x,那么你只需要spring-data-neo4j即可: org.springframework.boot spring-boot-starter-data-neo4j 3.節(jié)點與關系 新建節(jié)點類,id的屬性為Long而不能為long,還需要注意的是在Spring boot1.5中修飾id屬性的注釋為@GraphId,org.neo4j.ogm.annotation.Id不存在,效果一樣,都是Neo4j數(shù)據(jù)庫自動創(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;//類 @Property(name = "weight") private long weight;//權重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é)點關系類 有必要說明一下, @StartNode 和@EndNode注釋的類可以不是同一個類。@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就可以使用該接口提供的一些基礎的增刪改查方法。@Repository public interface BotRepository extends Neo4jRepository { BotNode findAllByName(String name);} 對于復雜的查詢我們可以參照上面講到的CQL語句執(zhí)行。@Repository public interface BotRelationRepository extends Neo4jRepository { //返回節(jié)點n以及n指向的所有節(jié)點與關系 @Query("MATCH p=(n:Bot)-[r:BotRelation]->(m:Bot) WHERE id(n)={0} RETURN p") List findAllByBotNode(BotNode botNode);//返回節(jié)點n以及n指向或指向n的所有節(jié)點與關系 @Query("MATCH p=(n:Bot)<-[r:BotRelation]->(m:Bot) WHERE m.name={name} RETURN p") List findAllBySymptom(@Param("name") String name);//返回節(jié)點n以及n指向或指向n的所有節(jié)點以及這些節(jié)點間的所有關系 @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.單元測試 保存@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='《奧特曼》'}] 保存成功! 補充 如果想保存關系的話MedicalNode node = new MedicalNode(-1l,"節(jié)點","測試"); medicalNodeRepository.save(node); MedicalNode node1 = new MedicalNode(-1l,"節(jié)點","測試"); medicalNodeRepository.save(node1); medicalRelationRepository.save(new MedicalRelation(-1l,node,node1,"關系")); 更新 接下來我們測試更新數(shù)據(jù): @Test public void updata(){ Movie movie = movieRepository.findAllById(8183l); movie.setName("《迪迦》"); movieRepository.save(movie); System.out.println(movieRepository.findAll()); } 執(zhí)行程序,報錯:java.lang.NullPointerException 我們看到程序執(zhí)行的CQL語句為:MATCH (n:Movie) WHERE n.id = { id_0 } WITH n RETURN n, ID(n) 然后我們在Neo4j瀏覽器控制臺執(zhí)行查詢語句: ![]() 這是為什么呢?在Neo4j中,根據(jù)Id查詢節(jié)點的語句為:MATCH (n:Movie) where id(n)=8183 RETURN n 我們修改Repository層的查詢方法:@Repository public interface MovieRepository extends Neo4jRepository { @Query("MATCH (n:Movie) where id(n)= RETURN n") Movie findAllById(@Param("id") Long id); } 再次執(zhí)行更新程序,結果為:[Movie{id=8183, name='《迪迦》'}] 更新成功! 換句話說,只要掌握了CQL語句,就基本啥都會了~! 還有,本書并不代表全部的Neo4j知識。 附錄 neo4j.conf漢化版For more details and a complete list of settings, please see https:///docs/operations-manual/current/reference/configuration-settings/ |
|