還有和Redis一樣好用的NoSQL
實(shí)際上為了更好的描述實(shí)體之間的關(guān)系,我們要是再繼續(xù)使用Redis的話,是不是感覺(jué)實(shí)體之間的關(guān)系不夠那么的明顯,雖然也是屬于NoSQL的一種,但是相對(duì)來(lái)說(shuō),Redis,表現(xiàn)實(shí)體之間的關(guān)系就沒(méi)有那么清晰了,為了更好的描述實(shí)體之間的關(guān)系,就會(huì)使用圖形數(shù)據(jù)庫(kù)來(lái)進(jìn)行了,那么今天阿粉介紹的,就是一個(gè)圖形化的數(shù)據(jù)可,Neo4J。
什么是Neo4J
Neo4j是一個(gè)世界領(lǐng)先的開(kāi)源的基于圖的數(shù)據(jù)庫(kù)。它是使用Java語(yǔ)言完全開(kāi)發(fā)的。那么什么是圖數(shù)據(jù)庫(kù)呢?圖數(shù)據(jù)庫(kù)是以圖結(jié)構(gòu)的形式存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫(kù)。它以節(jié)點(diǎn),關(guān)系和屬性的形式存儲(chǔ)應(yīng)用程序的數(shù)據(jù)。正如RDBMS以表的“行,列”的形式存儲(chǔ)數(shù)據(jù),GDBMS以圖的形式存儲(chǔ)數(shù)據(jù)。
RDBMS與圖數(shù)據(jù)庫(kù)的區(qū)別
1.Tables 表Graphs 圖表
2.Rows 行Nodes 節(jié)點(diǎn)
3.Columns and Data 列和數(shù)據(jù) Properties and its values屬性及其值
4.Constraints 約束Relationships 關(guān)系
5.Joins 加入Traversal 遍歷
說(shuō)完了圖形數(shù)據(jù)庫(kù),我們就來(lái)看看這個(gè) Neo4J 數(shù)據(jù)庫(kù)吧
Neo4J 數(shù)據(jù)庫(kù)的安裝
neo4j是用Java語(yǔ)言編寫(xiě)的圖形數(shù)據(jù)庫(kù),運(yùn)行時(shí)需要啟動(dòng)JVM進(jìn)程,因此,需安裝JAVA SE的JDK。關(guān)于 Java 怎么安裝,我就不用再多廢話了吧,到時(shí)候別忘了檢測(cè)一下 Java 的版本就好了,java -version
接下來(lái)我們就是要進(jìn)行一個(gè)安裝了,我們先去官網(wǎng),下載社區(qū)版,企業(yè)版要收費(fèi)的,注意哈。
官網(wǎng)地址
下載完成,直接開(kāi)始安裝,傻瓜式操作即可。
Neo4j應(yīng)用程序有如下主要的目錄結(jié)構(gòu):
- bin目錄:用于存儲(chǔ)Neo4j的可執(zhí)行程序
- conf目錄:用于控制Neo4j啟動(dòng)的配置文件
- data目錄:用于存儲(chǔ)核心數(shù)據(jù)庫(kù)文件
- plugins目錄:用于存儲(chǔ)Neo4j的插件
注意,如果你使用的是Zip的壓縮包來(lái)進(jìn)行的使用的話,那么你就需要注意一些地方,比如你如果是用 Zip 的包解壓之后,并且想要通過(guò) bat 的命令啟動(dòng),直接在目錄下進(jìn)行 cmd ,然后 neo4j.bat ,這時(shí)候可能會(huì)出現(xiàn)一個(gè)問(wèn)題,就是版本可能會(huì)出現(xiàn)問(wèn)題,你如果下載使用的是最新版的 Neo4J ,那么就可能會(huì)讓你使用 JDK 11 ,而阿粉就是踩過(guò)了這個(gè)大坑之后,才發(fā)現(xiàn),bat 閃退的原因。
- 警告: ERROR! Neo4j cannot be started using java version 1.8.0_181
- 警告: * Please use Oracle(R) Java(TM) 11, OpenJDK(TM) 11 to run Neo4j Server.
- * Please see https://neo4j.com/docs/ for Neo4j installation instructions.
- Invoke-Neo4j : This instance of Java is not supported
- 所在位置 E:\softFile\neo4j-community-4.4.2\bin\neo4j.ps1:21 字符: 7
- + Exit (Invoke-Neo4j -Verbose:$Arguments.Verbose -CommandArgs $Argument ...
- + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
- + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Invoke-Neo4j
這樣就是說(shuō)明我們的 JDk 的版本對(duì)應(yīng)的和 Neo4J 需要的 JDK 是不匹配的,我們就需要換一下我們的 JDK 了。把他換成 JDK 11 就好了,再次啟動(dòng)。
- neo4j.bat console
- E:\softFile\neo4j-community-4.4.2\bin>neo4j.bat console
- Directories in use:
- home: E:\softFile\neo4j-community-4.4.2
- config: E:\softFile\neo4j-community-4.4.2\conf
- logs: E:\softFile\neo4j-community-4.4.2\logs
- plugins: E:\softFile\neo4j-community-4.4.2\plugins
- import: E:\softFile\neo4j-community-4.4.2\import
- data: E:\softFile\neo4j-community-4.4.2\data
- certificates: E:\softFile\neo4j-community-4.4.2\certificates
- licenses: E:\softFile\neo4j-community-4.4.2\licenses
- run: E:\softFile\neo4j-community-4.4.2\run
- Starting Neo4j.
- 2021-12-19 12:37:08.121+0000 INFO Starting...
- 2021-12-19 12:37:09.665+0000 INFO This instance is ServerId{25e1fcb1} (25e1fcb1-702c-4b58-bcdc-3564df95b2a1)
- 2021-12-19 12:37:11.957+0000 INFO ======== Neo4j 4.4.2 ========
- 2021-12-19 12:37:14.556+0000 INFO Initializing system graph model for component 'security-users' with version -1 and status UNINITIALIZED
- 2021-12-19 12:37:14.567+0000 INFO Setting up initial user from defaults: neo4j
- 2021-12-19 12:37:14.568+0000 INFO Creating new user 'neo4j' (passwordChangeRequired=true, suspended=false)
- 2021-12-19 12:37:14.589+0000 INFO Setting version for 'security-users' to 3
- 2021-12-19 12:37:14.594+0000 INFO After initialization of system graph model component 'security-users' have version 3 and status CURRENT
- 2021-12-19 12:37:14.601+0000 INFO Performing postInitialization step for component 'security-users' with version 3 and status CURRENT
- 2021-12-19 12:37:15.979+0000 INFO Bolt enabled on 127.0.0.1:7687.
- 2021-12-19 12:37:17.200+0000 INFO Remote interface available at http://localhost:7474/
- 2021-12-19 12:37:17.206+0000 INFO id: 1ED17593750B5E6E3046A68E5254B92B64EE0B6CECA021D540D1B93BDFE67164
- 2021-12-19 12:37:17.206+0000 INFO name: system
- 2021-12-19 12:37:17.207+0000 INFO creationDate: 2021-12-19T12:37:12.956Z
- 2021-12-19 12:37:17.207+0000 INFO Started.
這時(shí)候,我們就直接訪問(wèn) localhost:7474 的端口,直接就能看到如下的畫(huà)面, 1.jpg
剛進(jìn)入的時(shí)候可能需要大家輸入帳號(hào)密碼,默認(rèn)的帳號(hào)密碼就是,neo4j 修改成你想要的就行了。
這樣登錄進(jìn)去我們就能開(kāi)始正式學(xué)習(xí) Neo4J 的所有內(nèi)容了。
Neo4J 的語(yǔ)法教學(xué)
Neo4j - CQL語(yǔ)法
- 它是Neo4j圖形數(shù)據(jù)庫(kù)的查詢(xún)語(yǔ)言。
- 它是一種聲明性模式匹配語(yǔ)言
- 它遵循SQL語(yǔ)法。
- 它的語(yǔ)法是非常簡(jiǎn)單且人性化、可讀的格式。
我們?cè)谥v語(yǔ)法之前首先我們先得看看 Neo4J 的構(gòu)建模塊,不然之后的查詢(xún)都是無(wú)意義的。
Neo4j圖數(shù)據(jù)庫(kù)主要有以下構(gòu)建塊 -
- 節(jié)點(diǎn)
- 屬性
- 關(guān)系
- 標(biāo)簽
- 數(shù)據(jù)瀏覽器
節(jié)點(diǎn)是圖表的基本單位。它包含具有鍵值對(duì)的屬性,如下所示
屬性是用于描述圖節(jié)點(diǎn)和關(guān)系的鍵值對(duì)
關(guān)系是圖形數(shù)據(jù)庫(kù)的另一個(gè)主要構(gòu)建塊。它連接兩個(gè)節(jié)點(diǎn),如下所示。
Label將一個(gè)公共名稱(chēng)與一組節(jié)點(diǎn)或關(guān)系相關(guān)聯(lián)。節(jié)點(diǎn)或關(guān)系可以包含一個(gè)或多個(gè)標(biāo)簽。我們可以為現(xiàn)有節(jié)點(diǎn)或關(guān)系創(chuàng)建新標(biāo)簽。我們可以從現(xiàn)有節(jié)點(diǎn)或關(guān)系中刪除現(xiàn)有標(biāo)簽。
Neo4j數(shù)據(jù)瀏覽器 一旦我們安裝Neo4j,我們可以訪問(wèn)Neo4j數(shù)據(jù)瀏覽器使用以下URL
http:// localhost:7474 / browser /
CQL 語(yǔ)法
CREATE 語(yǔ)法
- CREATE (<node-name>:<label-name>)
它是我們要?jiǎng)?chuàng)建的節(jié)點(diǎn)名稱(chēng)。
它是一個(gè)節(jié)點(diǎn)標(biāo)簽名稱(chēng)
我們可以創(chuàng)建一個(gè)節(jié)點(diǎn),然后給他安排上一個(gè)標(biāo)簽
- CREATE (emp:Employee)
當(dāng)我們看到
- Added 1 label, created 1 node, completed after 74 ms.
這就創(chuàng)建成功了,
那么怎么查看呢?
MATCH語(yǔ)法
- MATCH (<node-name>:<label-name>) return xxx
是這個(gè)樣子的
- MATCH (emp:Employee) return emp
- ╒═════╕
- │"emp"│
- ╞═════╡
- │{} │
- └─────┘
但是看到里面竟然沒(méi)有東西,就相當(dāng)于是一個(gè)空的對(duì)象,那是不是就應(yīng)該給里面放入屬性的操作呢?沒(méi)錯(cuò),肯定有
CREATE (emp:Employee{ id : 1001 ,name :"lucy", age : 10})
Added 1 label, created 1 node, set 3 properties, completed after 163 ms. 創(chuàng)建成功。
我們?cè)俅尾榭淳湍芸吹?/p>
- ╒══════════════════════════════════╕
- │"emp" │
- ╞══════════════════════════════════╡
- │{} │
- ├──────────────────────────────────┤
- │{"name":"lucy","id":1001,"age":10}│
- └──────────────────────────────────┘
如果我們想只要其中的一些對(duì)象的屬性,而不是全部屬性,那應(yīng)該怎么操作呢?
RETURN語(yǔ)法
RETURN 可以返回的是一個(gè)對(duì)象,也可以是對(duì)象中的屬性,比如:
- MATCH (emp:Employee) return emp.name
結(jié)果就是下面這個(gè)樣子的,大家看一下,是不是感覺(jué)還是挺好用的。
- ╒══════════╕
- │"emp.name"│
- ╞══════════╡
- │"Lokesh" │
- ├──────────┤
- │"jack" │
- ├──────────┤
- │"luxun" │
- ├──────────┤
- │"lucy" │
- └──────────┘
** WHERE語(yǔ)法**
- WHERE <condition>
為什么在前面的位置阿粉說(shuō),CQL 是和 SQL 類(lèi)型的,這完全是因?yàn)楹芏鄸|西和 SQL 是類(lèi)似的。
- MATCH (emp:Employee) where emp.name = 'jack' return emp
結(jié)果如下:
- ╒════════════════════════════════════════════════╕
- │"emp" │
- ╞════════════════════════════════════════════════╡
- │{"name":"jack","id":125,"deptno":10,"sal":35800}│
- └────────────────────────────────────────────────┘
相同的還有
| 布爾運(yùn)算符 | 描述 |
|---|---|
| AND | 和 |
| OR | 或者 |
| NOT | 非 |
| XOR | 異或 |
| 比較運(yùn)算符 | 描述 |
|---|---|
| = | “等于”運(yùn)算符 |
| <> | “不等于”運(yùn)算符 |
| < | “小于”運(yùn)算符 |
| > | “大于”運(yùn)算符 |
| <= | “小于或等于”運(yùn)算符。 |
| >= | “大于或等于”運(yùn)算符。 |
DELETE語(yǔ)法
刪除語(yǔ)法必然是有的,因?yàn)橛袆?chuàng)建,肯定有刪除。
- DELETE <node-name-list>
但是這個(gè)命令也不是單獨(dú)使用的哈,
- MATCH (e: Employee) DELETE e
直接刪除成功。
基礎(chǔ)的東西講完了,阿粉就得說(shuō)說(shuō)這個(gè)比較重要的內(nèi)容了,關(guān)系,
Neo4j 的關(guān)系
我們之前創(chuàng)建節(jié)點(diǎn)的時(shí)候,那叫一個(gè)簡(jiǎn)單舒適加愉快,但是創(chuàng)建關(guān)系就比較復(fù)雜了,因?yàn)樾枰紤]如何匹配到有關(guān)系的兩個(gè)節(jié)點(diǎn),以及關(guān)系本身的屬性如何設(shè)置。這里我們就簡(jiǎn)單學(xué)一下如何建立節(jié)點(diǎn)之間的關(guān)系。
由于Neo4j CQL語(yǔ)法是以人類(lèi)可讀的格式。Neo4j CQL也使用類(lèi)似的箭頭標(biāo)記來(lái)創(chuàng)建兩個(gè)節(jié)點(diǎn)之間的關(guān)系。
每個(gè)關(guān)系(→)包含兩個(gè)節(jié)點(diǎn)
在Neo4j中,兩個(gè)節(jié)點(diǎn)之間的關(guān)系是有方向性的。它們是單向或雙向的。
如果我們嘗試創(chuàng)建一個(gè)沒(méi)有任何方向的關(guān)系,那么就會(huì)報(bào)錯(cuò)。
關(guān)系創(chuàng)建語(yǔ)法
- CREATE (<node1-details>)-[<relationship-details>]->(<node2-details>)
我們這里直接使用創(chuàng)建新的節(jié)點(diǎn)來(lái)創(chuàng)建關(guān)系。
- CREATE (book:Book)-[contains:CONTAINS]->(bookStore:BOOKSTORE)
提示創(chuàng)建成功
- Added 2 labels, created 2 nodes, created 1 relationship, completed after 199 ms.
這里關(guān)系名稱(chēng)是“CONTAINS”
關(guān)系標(biāo)簽是“contains”。
- MATCH (book:Book)-[contains:CONTAINS]->(bookStore:BOOKSTORE) return contains
這么看是看不出有啥關(guān)系的,但是,我們可以從另外的一個(gè)位置
這樣看下來(lái),這個(gè) Neo4J 簡(jiǎn)單操作是不是就學(xué)會(huì)了,阿粉接下來(lái)的文章中講怎么使用 Java 來(lái)操作 Neo4J 數(shù)據(jù)庫(kù)。歡迎大家來(lái)觀看。























