Neo4j是一個高性能的開源的,使用Java語言實現(xiàn)的NoSQL圖數(shù)據(jù)庫,它將結(jié)構(gòu)化數(shù)據(jù)存儲在網(wǎng)絡(luò)上而不是表中。它是一個嵌入式的、基于磁盤的、具備完全的事務(wù)特性的Java持久化引擎,但是它將結(jié)構(gòu)化數(shù)據(jù)存儲在網(wǎng)絡(luò)(從數(shù)學(xué)角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數(shù)據(jù)庫的所有特性?,F(xiàn)實中很多數(shù)據(jù)都是用圖來表達的,比如社交網(wǎng)絡(luò)中人與人的關(guān)系、地圖數(shù)據(jù)、或是基因信息等等。RDBMS并不適合表達這類數(shù)據(jù),而且由于海量數(shù)據(jù)的存在,讓其顯得捉襟見肘。NoSQL數(shù)據(jù)庫的興起,很好地解決了海量數(shù)據(jù)的存放問題,圖數(shù)據(jù)庫也是NoSQL的一個分支,相比于NoSQL中的其他分支,它很適合用來原生表達圖結(jié)構(gòu)的數(shù)據(jù)。圖數(shù)據(jù)庫存儲的結(jié)構(gòu)就如同計算機科學(xué)中的數(shù)據(jù)結(jié)構(gòu)中所論述的圖,由頂點和邊組成。
Neo4j適用于圖形一類數(shù)據(jù),例如:社會關(guān)系,公共交通網(wǎng)絡(luò),地圖及網(wǎng)絡(luò)拓撲。Neo4j并為此專門進行了算法優(yōu)化,也開發(fā)了相關(guān)的查詢語言。這是Neo4j與其他NoSQL數(shù)據(jù)庫的最顯著區(qū)別。Neo4j不適用于:
◆記錄大量基于事件的數(shù)據(jù)(例如日志條目或傳感器數(shù)據(jù))
◆對大規(guī)模分布式數(shù)據(jù)進行處理,類似于Hadoop
◆二進制數(shù)據(jù)存儲
◆適合于保存在關(guān)系型數(shù)據(jù)庫中的結(jié)構(gòu)化數(shù)據(jù)
Neo4j提供了免費的社區(qū)版本,在數(shù)據(jù)量不大的情況下,可以用于開發(fā)。大規(guī)模部署與應(yīng)用建議購買企業(yè)版。在ubuntu bionic下的安裝過程如下所示:
wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - echo 'deb https://debian.neo4j.com stable latest' | sudo tee /etc/apt/sources.list.d/neo4j.list sudo apt-get update # 安裝社區(qū)版本 sudo apt-get install -y neo4j # 安裝企業(yè)版本 sudo apt-get install -y neo4j-enterprise systemctl status neo4j systemctl start neo4j systemctl enable neo4j # 直接在本地檢測是否安裝成功 curl http://localhost:7474/
同樣的,缺省情況下是只接受本地訪問要求,可以編輯/etc/neo4j/neo4j.conf文件增加"dbms.default_listen_address=0.0.0.0"這一行,隨后重新啟動服務(wù)即可遠程訪問:
sed -i '$adbms.default_listen_address=0.0.0.0' /etc/neo4j/neo4j.conf systemctl restart neo4j
以上使用sed命令增加了綁定地址,隨后使用主流的瀏覽器(Edge,firefox,chrome)就可以訪問數(shù)據(jù)庫,如下圖所示:
第一次訪問時的缺省用戶名與口令均是Neo4j,登錄后需要修改。隨后就進入到工作界面如下:
也可以使用傳統(tǒng)的數(shù)據(jù)庫客戶端如DBeaver來訪問Neo4j數(shù)據(jù)庫。此時的連接屬性設(shè)置如下圖所示:
與SQL類似,Neo4j推出了專用于圖的聲明性文本查詢語言Cypher。Cypher包含語句、關(guān)鍵詞和表達式,比如謂詞、函數(shù)等,其中很多大家都很熟悉(如WHERE,ORDER BY,SKIP LIMIT,AND,p.unitPrice > 10)。與SQL不同,Cypher完全是表達圖模式的。添加了一個特殊子句MATCH來匹配數(shù)據(jù)中的這些模式。使用圓括號表示節(jié)點實體的圓,比如:(p:Product)。而關(guān)系的箭頭使用-->來表達。Cypher語言在其它方面的重點是圖概念,例如路徑、可變長度路徑、最短路徑函數(shù);列表上許多功能,操作和謂詞的支持以及鏈接查詢的功能。使用Cypher可以更新圖結(jié)構(gòu)和數(shù)據(jù),甚至導(dǎo)入大量的CSV數(shù)據(jù)。通過用戶定義的過程能夠擴展語言。通過openCypher項目,Cypher已經(jīng)成為一種現(xiàn)代圖查詢語言的開放標準,并且得到了多家數(shù)據(jù)庫公司的支持。其語法可以參考[語法卡](https://neo4j.com/docs/cypher-refcard/current/)。
可以通過多種方式來訪問Neo4j數(shù)據(jù)庫:
◆ 使用命令行工具如Cypher shell等
◆使用主流的瀏覽器訪問,Neo4j稱為Neo4j browser
◆其它第三方工具軟件
模仿movie graph,我們建立一個中文的圖數(shù)據(jù)庫。相關(guān)創(chuàng)建內(nèi)容如下:
CREATE (Jiangshuying:Person {name:'江疏影', born:1986}) CREATE (胡哥:Person {name:'胡哥', born:1982}) CREATE (Jindong:Person {name:'靳東', born:1976}) CREATE (萬莤:Person {name:'萬莤', born:1982}) CREATE (Gentlemen:Teleplay {title:"戀愛先生", released:2017}) CREATE (NothingButThirty:Teleplay {title:'三十而已', released:2020}) CREATE (外科風(fēng)云:Teleplay {title:'外科風(fēng)云', released:2017}) CREATE (偽裝者:Teleplay {title:'偽裝者', released:2015}) CREATE (好先生:Teleplay {title:'好先生', released:2016}) CREATE (縣委大院:Teleplay {title:'縣委大院', released:2022}) CREATE (Jiangshuying)-[:ACTED_IN {roles:['江萊']}]->(好先生) CREATE (Jiangshuying)-[:ACTED_IN {roles:['羅鑰']}]->(Gentlemen) CREATE (Jiangshuying)-[:ACTED_IN {roles:['王漫妮']}]->(NothingButThirty) CREATE (Jindong)-[:ACTED_IN {roles:['莊恕']}]->(外科風(fēng)云) CREATE (Jindong)-[:ACTED_IN {roles:['明樓']}]->(偽裝者) CREATE (Jindong)-[:ACTED_IN {roles:['Boss']}]->(Gentlemen) CREATE (胡哥)-[:ACTED_IN {roles:['明臺']}]->(偽裝者) CREATE (胡哥)-[:ACTED_IN {roles:['梅曉哥']}]->(縣委大院) CREATE (萬莤)-[:ACTED_IN {roles:['徐麗']}]->(好先生)
此時形成的知識圖譜如下所示:
由此可見Neo4j對中文的支持非常好,可以混合用中英文來建立自己的知識圖譜。下面的代碼顯示了,尋找萬莤與胡哥間相互認識的最短路徑。
match p=shortestpath((:Person {name:'江疏影'})-[*]-(:Person {name:'胡哥'})) return p
查詢結(jié)果如下圖所示:
當(dāng)然這只是一個示例,因為并沒有真正梳理每個人的關(guān)系,僅僅是從現(xiàn)有的知識中計算出來的。對于知識圖譜來說,信息越充分,威力越巨大。
需要注意的是,以上命令必須一次性輸入執(zhí)行完成,否則就會出現(xiàn)看起來是一樣的節(jié)點,但Neo4j會認為是不同的對象,從而形成意料之外的節(jié)點與關(guān)系。
Python操作知識圖譜
安裝了Py2neo就可以使用Python操作Neo4j了。我們也就可以在線處理大規(guī)模的數(shù)據(jù),實現(xiàn)知識圖譜的自動構(gòu)建了。安裝方法非常簡單,直接在cmd中輸入下列命令即可:
pip install py2neo
以下代碼創(chuàng)建了一個極簡的知識圖譜,如下圖所示:
示例代碼如下所示:文章來源:http://www.zghlxwxcb.cn/news/detail-438784.html
from py2neo import Node, Relationship, Graph, NodeMatcher, RelationshipMatcher # 遠端NEO4J服務(wù)器 test_graph = Graph('http://172.20.103.169:7474',auth=('neo4j','88488848')) A = Node("員工", name="張三", PID = 100) B = Node("員工", name="李四", PID = 100) C = Node("公司", name="西安衍輿", CID = 99) test_graph.create(A) test_graph.create(B) test_graph.create(C) test_graph.create(Relationship(A, "工作于", C)) test_graph.create(Relationship(B, "工作于", C)) print(test_graph.nodes.match('員工').all())
從圖中可以看出,Neo4j對于中文的支持是非常好的。能夠以非常符合中文習(xí)慣的方式寫出相關(guān)知識。真正能夠?qū)嵱玫闹R圖譜必須是日積月累的過程,有了稱手的工具后,知識本身的正確性才是重點。文章來源地址http://www.zghlxwxcb.cn/news/detail-438784.html
到了這里,關(guān)于Python工具箱系列(三十一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!