日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

neo4j 知识图谱_知识图谱里的知识存储:neo4j的介绍和使用

發(fā)布時(shí)間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 neo4j 知识图谱_知识图谱里的知识存储:neo4j的介绍和使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一般情況下,我們使用數(shù)據(jù)庫(kù)查找事物間的聯(lián)系的時(shí)候,只需要短程關(guān)系的查詢(xún)(兩層以?xún)?nèi)的關(guān)聯(lián))。當(dāng)需要進(jìn)行更長(zhǎng)程的,更廣范圍的關(guān)系查詢(xún)時(shí),就需要圖數(shù)據(jù)庫(kù)的功能。

而隨著社交、電商、金融、零售、物聯(lián)網(wǎng)等行業(yè)的快速發(fā)展,現(xiàn)實(shí)世界的事物之間織起了一張巨大復(fù)雜的關(guān)系網(wǎng),傳統(tǒng)數(shù)據(jù)庫(kù)面對(duì)這樣復(fù)雜關(guān)系往往束手無(wú)策。因此,圖數(shù)據(jù)庫(kù)應(yīng)運(yùn)而生。

圖數(shù)據(jù)庫(kù)(Graph database)指的是以圖數(shù)據(jù)結(jié)構(gòu)的形式來(lái)存儲(chǔ)和查詢(xún)數(shù)據(jù)的數(shù)據(jù)庫(kù)。

從 http://db-engines.com/en/ranking 可以發(fā)現(xiàn),Neo4j 是目前用的最多的圖數(shù)據(jù)庫(kù),世界數(shù)據(jù)庫(kù)排行榜上排名21位。

Neo4J屬于原生圖數(shù)據(jù)庫(kù),其使用的存儲(chǔ)后端專(zhuān)門(mén)為圖結(jié)構(gòu)數(shù)據(jù)的存儲(chǔ)和管理進(jìn)行定制和優(yōu)化的,在圖上互相關(guān)聯(lián)的節(jié)點(diǎn)在數(shù)據(jù)庫(kù)中的物理地址也指向彼此,因此更能發(fā)揮出圖結(jié)構(gòu)形式數(shù)據(jù)的優(yōu)勢(shì)。

知識(shí)圖譜中,知識(shí)的組織形式采用的就是圖結(jié)構(gòu),所以非常適合用neo4j進(jìn)行存儲(chǔ)。

圖數(shù)據(jù)庫(kù)的優(yōu)勢(shì)在于:

  • 性能上,對(duì)長(zhǎng)程關(guān)系的查詢(xún)速度快
  • 擅于發(fā)現(xiàn)隱藏的關(guān)系,例如通過(guò)判斷圖上兩點(diǎn)之間有沒(méi)有走的通的路徑,就可以發(fā)現(xiàn)事物間的關(guān)聯(lián)

數(shù)據(jù)存儲(chǔ)形式

neo4j的數(shù)據(jù)存儲(chǔ)形式 主要是 節(jié)點(diǎn)(node)和 邊(edge) 來(lái)組織數(shù)據(jù)。node可以代表知識(shí)圖譜中的實(shí)體,edge可以用來(lái)代表實(shí)體間的關(guān)系,關(guān)系可以有方向,兩端對(duì)應(yīng)開(kāi)始節(jié)點(diǎn)和結(jié)束節(jié)點(diǎn)。
另外,可以在node上加一個(gè)或多個(gè)標(biāo)簽(Node Label)表示實(shí)體的分類(lèi),以及一個(gè)鍵值對(duì)集合來(lái)表示該實(shí)體除了關(guān)系屬性之外的一些額外屬性。關(guān)系也可以附帶額外的屬性。

查詢(xún)語(yǔ)言cypher

neo4j采用自己設(shè)計(jì)的查詢(xún)語(yǔ)言cypher,其特點(diǎn)和sql有很多相似的地方。match、where、return是最常用到的關(guān)鍵詞:

  • match: 相當(dāng)于 sql中的select,用來(lái)說(shuō)明查詢(xún)匹配的數(shù)據(jù)模式(或者說(shuō)圖模式)
  • where: 用來(lái)限制node或者關(guān)系中部分屬性的屬性值,從而返回我們想要的數(shù)據(jù)
  • return: 返回節(jié)點(diǎn)或者關(guān)系

安裝neo4j

這里我們使用docker安裝neo4j,安裝命令行如下:

docker run -d --name=Neo4j--publish=7474:7474 --publish=7687:7687 --volume=$HOME/neo4j/data:/data --volume=$HOME/neo4j/import:/importneo4j

根據(jù)配置參數(shù),我們將容器內(nèi)的7474端口掛載到外部宿主機(jī)的7474端口,并設(shè)置好文件夾的映射關(guān)系,注意/import文件夾下放的是將要導(dǎo)入數(shù)據(jù)庫(kù)的csv文件。
接著在瀏覽器中打開(kāi) “ http://localhost:7474/ ”,就可以訪問(wèn)Neo4j管理界面了。

neo4j網(wǎng)頁(yè)管理界面

我們通過(guò)一個(gè)例子來(lái)說(shuō)明如何運(yùn)用neo4j數(shù)據(jù)庫(kù)。

1. 導(dǎo)入數(shù)據(jù)

我們這里有兩個(gè)csv文件如下圖,左邊的nodes_companies.csv是一部分公司節(jié)點(diǎn),右邊的edges_director_duration.csv是這些公司互相之間的服務(wù)關(guān)系。

nodes_companies.csv文件和edges_director_duration.csv

把這兩個(gè)文件放到neo4j根目錄下的import文件夾內(nèi),使用LOAD…AS row語(yǔ)句讀取,表示將csv文件按行讀取,每行的變量名為row。再使用MERGE指令創(chuàng)建節(jié)點(diǎn),將csv文件的第一列數(shù)據(jù)與第二列數(shù)據(jù)匯總為一個(gè)結(jié)點(diǎn)內(nèi)的兩條屬性信息。

LOAD CSV WITH HEADERS FROM "file:///nodes_companies.csv" AS row MERGE (c:Company {companyId:row.companyId, companyName:row.name})

這里提一下cypher中兩個(gè)用于創(chuàng)建新的數(shù)據(jù)的兩個(gè)關(guān)鍵詞: create 和 merge

merge:在數(shù)據(jù)庫(kù)中可以匹配到模式相同的數(shù)據(jù)就返回,沒(méi)有則創(chuàng)建一條這樣的數(shù)據(jù)(有則返回,沒(méi)有則創(chuàng)建)
create:無(wú)論如何,都會(huì)創(chuàng)建一條新的數(shù)據(jù)

上面再LOAD文件時(shí)使用merge可以避免導(dǎo)入完全重復(fù)的數(shù)據(jù)。

導(dǎo)入公司節(jié)點(diǎn)

通過(guò)第二個(gè)csv文件的START_ID和END_ID字段為第一個(gè)csv文件的company之間建立聯(lián)系,即不斷遍歷第二個(gè)文件的每一行,根據(jù)START_ID和END_ID使用where找到圖中相應(yīng)節(jié)點(diǎn),并為它們添加相應(yīng)的服務(wù)(INTERLOCK)關(guān)系,添加關(guān)系屬性為weight。

LOAD CSV WITH HEADERS FROM "file:///edges_director_duration.csv" AS row match (c1:company), (c2:company) where row.START_ID = c1.id and row.END_ID = c2.id create (c1)-[r:INTERLOCK{weight:row.years_served}]->(c2)

注意在cypher語(yǔ)句里,節(jié)點(diǎn)是用()括起來(lái)表示,關(guān)系則用 [] 括起來(lái)表示。

導(dǎo)入公司關(guān)系

2.創(chuàng)建關(guān)系

這里我們嘗試自己創(chuàng)建一條新的關(guān)系,比如在id = 281 和 id = 879 的兩個(gè)節(jié)點(diǎn)間創(chuàng)建一條標(biāo)簽為“INTERLOCK”的關(guān)系。

先match和where鎖定 id = 281 和 id = 879的兩個(gè)公司節(jié)點(diǎn),然后用create創(chuàng)建他們之間的關(guān)系,并添加特定關(guān)系屬性信息(例如weight為10)。

cypher語(yǔ)句如下:

MATCH (c1:company),(c2:company) WHERE c1.id = “281” AND c2.id = “879” CREATE (c1)-[r:INTERLOCK{weight:10}]->(c2) RETURN (c1)-[r]-(c2)

這條語(yǔ)句的意思是,匹配類(lèi)別標(biāo)簽為company,id分別等于281和879的兩個(gè)公司節(jié)點(diǎn),設(shè)置變量名為c1和c2,在他們之間創(chuàng)建關(guān)系,關(guān)系變量名為r,這里 ()-[]-() 代表無(wú)向邊,()-[]->() 代表有向邊。

返回結(jié)果 (c1)-[r]-(c2) 匹配到的子圖如下所示:

創(chuàng)建新的關(guān)系

3.比較復(fù)雜的查詢(xún)

下面這條語(yǔ)句會(huì)把所有公司中,指向其他公司的連接關(guān)系數(shù)超過(guò)75條的公司全部找出來(lái)。用空括號(hào)()代表任一節(jié)點(diǎn),函數(shù)count() 計(jì)算關(guān)系的數(shù)量。

MATCH (c:company)-[r:INTERLOCK]->() WITH c, count(r) as relaNum WHERE relaNum>=75 RETURN c,relaNum

4.最短路徑查詢(xún)

neo4j還還內(nèi)置實(shí)現(xiàn)了一套圖搜索算法,并提供了相關(guān)函數(shù)接口,比如你想查詢(xún)兩個(gè)節(jié)點(diǎn)之間的最短路徑,就可以用下面的查詢(xún)語(yǔ)句:

  • shortestPath():返回兩節(jié)點(diǎn)間的最短路徑
match (c1:company), (c2:company), p=shortestPath((c1)-[r:INTERLOCK*..10]->(c2)) where c1.id <> c2.id return p,length(p) order by length(p) desc limit 1000

直接調(diào)用函數(shù)shortestPath,傳入的參數(shù)為選定的關(guān)系,選取任意兩個(gè)節(jié)點(diǎn),<>表示id不相等,因?yàn)椴檎业膬蓚€(gè)點(diǎn)不能是同一個(gè)點(diǎn),*..10表示10度以?xún)?nèi)的所有關(guān)系,返回降序排序的長(zhǎng)度,限制在1000個(gè)防止內(nèi)存溢出)

  • allshortestpaths():返回兩節(jié)點(diǎn)間所有的最短路徑
MATCH (c1:company), (c2:company), p = allshortestpaths((c1)-[r:INTERLOCK*]-(c2)) WHERE c1.id <> c2.id RETURN extract(n in nodes(p)|n.name) as Nodes, length(p) as pathLength, reduce(s=0, e in relationships(p)| s + toInt(e.weight)) as pathDist LIMIT 1000

allshortestpaths函數(shù)返回結(jié)果

語(yǔ)句中的pathLength是路徑的邊數(shù)(第一句return),pathDist是路徑上所有帶weight邊的加權(quán)總和(第二句return)。

總結(jié)

以上是生活随笔為你收集整理的neo4j 知识图谱_知识图谱里的知识存储:neo4j的介绍和使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。