還有和Redis一樣好用的NoSQL
實(shí)際上為了更好的描述實(shí)體之間的關(guān)系,我們要是再繼續(xù)使用Redis的話,是不是感覺實(shí)體之間的關(guān)系不夠那么的明顯,雖然也是屬于NoSQL的一種,但是相對來說,Redis,表現(xiàn)實(shí)體之間的關(guān)系就沒有那么清晰了,為了更好的描述實(shí)體之間的關(guān)系,就會使用圖形數(shù)據(jù)庫來進(jìn)行了,那么今天阿粉介紹的,就是一個圖形化的數(shù)據(jù)可,Neo4J。
什么是Neo4J
Neo4j是一個世界領(lǐng)先的開源的基于圖的數(shù)據(jù)庫。它是使用Java語言完全開發(fā)的。那么什么是圖數(shù)據(jù)庫呢?圖數(shù)據(jù)庫是以圖結(jié)構(gòu)的形式存儲數(shù)據(jù)的數(shù)據(jù)庫。它以節(jié)點(diǎn),關(guān)系和屬性的形式存儲應(yīng)用程序的數(shù)據(jù)。正如RDBMS以表的“行,列”的形式存儲數(shù)據(jù),GDBMS以圖的形式存儲數(shù)據(jù)。
RDBMS與圖數(shù)據(jù)庫的區(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 遍歷
說完了圖形數(shù)據(jù)庫,我們就來看看這個 Neo4J 數(shù)據(jù)庫吧
Neo4J 數(shù)據(jù)庫的安裝
neo4j是用Java語言編寫的圖形數(shù)據(jù)庫,運(yùn)行時需要啟動JVM進(jìn)程,因此,需安裝JAVA SE的JDK。關(guān)于 Java 怎么安裝,我就不用再多廢話了吧,到時候別忘了檢測一下 Java 的版本就好了,java -version
接下來我們就是要進(jìn)行一個安裝了,我們先去官網(wǎng),下載社區(qū)版,企業(yè)版要收費(fèi)的,注意哈。
官網(wǎng)地址
下載完成,直接開始安裝,傻瓜式操作即可。
Neo4j應(yīng)用程序有如下主要的目錄結(jié)構(gòu):
- bin目錄:用于存儲Neo4j的可執(zhí)行程序
- conf目錄:用于控制Neo4j啟動的配置文件
- data目錄:用于存儲核心數(shù)據(jù)庫文件
- plugins目錄:用于存儲Neo4j的插件
注意,如果你使用的是Zip的壓縮包來進(jìn)行的使用的話,那么你就需要注意一些地方,比如你如果是用 Zip 的包解壓之后,并且想要通過 bat 的命令啟動,直接在目錄下進(jìn)行 cmd ,然后 neo4j.bat ,這時候可能會出現(xiàn)一個問題,就是版本可能會出現(xiàn)問題,你如果下載使用的是最新版的 Neo4J ,那么就可能會讓你使用 JDK 11 ,而阿粉就是踩過了這個大坑之后,才發(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
這樣就是說明我們的 JDk 的版本對應(yīng)的和 Neo4J 需要的 JDK 是不匹配的,我們就需要換一下我們的 JDK 了。把他換成 JDK 11 就好了,再次啟動。
- 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.
這時候,我們就直接訪問 localhost:7474 的端口,直接就能看到如下的畫面, 1.jpg
剛進(jìn)入的時候可能需要大家輸入帳號密碼,默認(rèn)的帳號密碼就是,neo4j 修改成你想要的就行了。
這樣登錄進(jìn)去我們就能開始正式學(xué)習(xí) Neo4J 的所有內(nèi)容了。
Neo4J 的語法教學(xué)
Neo4j - CQL語法
- 它是Neo4j圖形數(shù)據(jù)庫的查詢語言。
- 它是一種聲明性模式匹配語言
- 它遵循SQL語法。
- 它的語法是非常簡單且人性化、可讀的格式。
我們在講語法之前首先我們先得看看 Neo4J 的構(gòu)建模塊,不然之后的查詢都是無意義的。
Neo4j圖數(shù)據(jù)庫主要有以下構(gòu)建塊 -
- 節(jié)點(diǎn)
- 屬性
- 關(guān)系
- 標(biāo)簽
- 數(shù)據(jù)瀏覽器
節(jié)點(diǎn)是圖表的基本單位。它包含具有鍵值對的屬性,如下所示
屬性是用于描述圖節(jié)點(diǎn)和關(guān)系的鍵值對
關(guān)系是圖形數(shù)據(jù)庫的另一個主要構(gòu)建塊。它連接兩個節(jié)點(diǎn),如下所示。
Label將一個公共名稱與一組節(jié)點(diǎn)或關(guān)系相關(guān)聯(lián)。節(jié)點(diǎn)或關(guān)系可以包含一個或多個標(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,我們可以訪問Neo4j數(shù)據(jù)瀏覽器使用以下URL
http:// localhost:7474 / browser /
CQL 語法
CREATE 語法
- CREATE (<node-name>:<label-name>)
它是我們要創(chuàng)建的節(jié)點(diǎn)名稱。
它是一個節(jié)點(diǎn)標(biāo)簽名稱
我們可以創(chuàng)建一個節(jié)點(diǎn),然后給他安排上一個標(biāo)簽
- CREATE (emp:Employee)
當(dāng)我們看到
- Added 1 label, created 1 node, completed after 74 ms.
這就創(chuàng)建成功了,
那么怎么查看呢?
MATCH語法
- MATCH (<node-name>:<label-name>) return xxx
是這個樣子的
- MATCH (emp:Employee) return emp
- ╒═════╕
- │"emp"│
- ╞═════╡
- │{} │
- └─────┘
但是看到里面竟然沒有東西,就相當(dāng)于是一個空的對象,那是不是就應(yīng)該給里面放入屬性的操作呢?沒錯,肯定有
CREATE (emp:Employee{ id : 1001 ,name :"lucy", age : 10})
Added 1 label, created 1 node, set 3 properties, completed after 163 ms. 創(chuàng)建成功。
我們再次查看就能看到
- ╒══════════════════════════════════╕
- │"emp" │
- ╞══════════════════════════════════╡
- │{} │
- ├──────────────────────────────────┤
- │{"name":"lucy","id":1001,"age":10}│
- └──────────────────────────────────┘
如果我們想只要其中的一些對象的屬性,而不是全部屬性,那應(yīng)該怎么操作呢?
RETURN語法
RETURN 可以返回的是一個對象,也可以是對象中的屬性,比如:
- MATCH (emp:Employee) return emp.name
結(jié)果就是下面這個樣子的,大家看一下,是不是感覺還是挺好用的。
- ╒══════════╕
- │"emp.name"│
- ╞══════════╡
- │"Lokesh" │
- ├──────────┤
- │"jack" │
- ├──────────┤
- │"luxun" │
- ├──────────┤
- │"lucy" │
- └──────────┘
** WHERE語法**
- WHERE <condition>
為什么在前面的位置阿粉說,CQL 是和 SQL 類型的,這完全是因?yàn)楹芏鄸|西和 SQL 是類似的。
- 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àn)橛袆?chuàng)建,肯定有刪除。
- DELETE <node-name-list>
但是這個命令也不是單獨(dú)使用的哈,
- MATCH (e: Employee) DELETE e
直接刪除成功。
基礎(chǔ)的東西講完了,阿粉就得說說這個比較重要的內(nèi)容了,關(guān)系,
Neo4j 的關(guān)系
我們之前創(chuàng)建節(jié)點(diǎn)的時候,那叫一個簡單舒適加愉快,但是創(chuàng)建關(guān)系就比較復(fù)雜了,因?yàn)樾枰紤]如何匹配到有關(guān)系的兩個節(jié)點(diǎn),以及關(guān)系本身的屬性如何設(shè)置。這里我們就簡單學(xué)一下如何建立節(jié)點(diǎn)之間的關(guān)系。
由于Neo4j CQL語法是以人類可讀的格式。Neo4j CQL也使用類似的箭頭標(biāo)記來創(chuàng)建兩個節(jié)點(diǎn)之間的關(guān)系。
每個關(guān)系(→)包含兩個節(jié)點(diǎn)
在Neo4j中,兩個節(jié)點(diǎn)之間的關(guān)系是有方向性的。它們是單向或雙向的。
如果我們嘗試創(chuàng)建一個沒有任何方向的關(guān)系,那么就會報(bào)錯。
關(guān)系創(chuàng)建語法
- CREATE (<node1-details>)-[<relationship-details>]->(<node2-details>)
我們這里直接使用創(chuàng)建新的節(jié)點(diǎn)來創(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)系名稱是“CONTAINS”
關(guān)系標(biāo)簽是“contains”。
- MATCH (book:Book)-[contains:CONTAINS]->(bookStore:BOOKSTORE) return contains
這么看是看不出有啥關(guān)系的,但是,我們可以從另外的一個位置
這樣看下來,這個 Neo4J 簡單操作是不是就學(xué)會了,阿粉接下來的文章中講怎么使用 Java 來操作 Neo4J 數(shù)據(jù)庫。歡迎大家來觀看。