摘要:Neo4j
喂饥,Python
Neo4j下載安裝
在Ubuntu系統(tǒng)下聯(lián)網(wǎng)直接使用curl下載壓縮包
curl -O http://dist.neo4j.org/neo4j-community-3.4.5-unix.tar.gz
移動(dòng)目錄并解壓
root@ubuntu:~# mv neo4j-community-3.4.5-unix.tar.gz /opt
root@ubuntu:/opt# tar -axvf neo4j-community-3.4.5-unix.tar.gz
修改配置文件
root@ubuntu:/opt/# cd neo4j-community-3.4.5/conf
root@ubuntu:/opt/neo4j-community-3.4.5/conf# vim neo4j.conf
對(duì)如下內(nèi)容進(jìn)行修改
# 修改第22行l(wèi)oad csv時(shí)l路徑,在前面加個(gè)#集侯,可從任意路徑讀取文件
#dbms.directories.import=import
# 修改35行和36行浓体,設(shè)置JVM初始堆內(nèi)存和JVM最大堆內(nèi)存
# 生產(chǎn)環(huán)境給的JVM最大堆內(nèi)存越大越好,但是要小于機(jī)器的物理內(nèi)存
dbms.memory.heap.initial_size=5g
dbms.memory.heap.max_size=10g
# 修改46行生闲,可以認(rèn)為這個(gè)是緩存碍讯,如果機(jī)器配置高,這個(gè)越大越好
dbms.memory.pagecache.size=10g
# 修改54行倍啥,去掉改行的#,可以遠(yuǎn)程通過ip訪問neo4j數(shù)據(jù)庫
dbms.connectors.default_listen_address=0.0.0.0
# 默認(rèn) bolt端口是7687蒲稳,http端口是7474氮趋,https關(guān)口是7473,不修改下面3項(xiàng)也可以
# 修改71行弟塞,去掉#凭峡,設(shè)置http端口為7687拙已,端口可以自定義决记,只要不和其他端口沖突就行
#dbms.connector.bolt.listen_address=:7687
# 修改75行,去掉#倍踪,設(shè)置http端口為7474,端口可以自定義,只要不和其他端口沖突就行
dbms.connector.http.listen_address=:7474
# 修改79行,去掉#,設(shè)置https端口為7473疫赎,端口可以自定義陌僵,只要不和其他端口沖突就行
dbms.connector.https.listen_address=:7473
# 修改227行,去掉#,允許從遠(yuǎn)程url來load csv
dbms.security.allow_csv_import_from_file_urls=true
# 修改246行茂附,允許使用neo4j-shell,類似于mysql 命令行之類的
dbms.shell.enabled=true
# 修改235行,去掉#新思,設(shè)置連接neo4j-shell的端口假哎,一般都是localhost或者127.0.0.1,這樣安全装畅,其他地址的話汤锨,一般使用https就行
dbms.shell.host=127.0.0.1
# 修改250行慎菲,去掉#,設(shè)置neo4j-shell端口暑中,端口可以自定義笆呆,只要不和其他端口沖突就行
dbms.shell.port=1337
# 修改254行,設(shè)置neo4j可讀可寫
dbms.read_only=false
添加neo4j環(huán)境變量
root@ubuntu:/opt/neo4j-community-3.4.5/conf# vim ~/.bashrc
export PATH=$PATH:/opt/neo4j-community-3.4.5/bin
root@ubuntu:/opt/neo4j-community-3.4.5/conf# source ~/.bashrc
啟動(dòng)砍的,停止杆麸,查看neo4j服務(wù)
root@ubuntu:~# neo4j start
Active database: graph.db
Directories in use:
home: /opt/neo4j-community-3.4.5
config: /opt/neo4j-community-3.4.5/conf
logs: /opt/neo4j-community-3.4.5/logs
plugins: /opt/neo4j-community-3.4.5/plugins
import: NOT SET
data: /opt/neo4j-community-3.4.5/data
certificates: /opt/neo4j-community-3.4.5/certificates
run: /opt/neo4j-community-3.4.5/run
Starting Neo4j.
WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j manual.
Started neo4j (pid 26458). It is available at http://0.0.0.0:7474/
There may be a short delay until the server is ready.
See /opt/neo4j-community-3.4.5/logs/neo4j.log for current status.
root@ubuntu:~# neo4j status
Neo4j is running at pid 26458
root@ubuntu:~# neo4j stop
Stopping Neo4j.. stopped
root@ubuntu:~#
查看Web客戶端打開http://0.0.0.0:7474/
纸型,配置文件中默認(rèn)的http端口號(hào)是7474甥材,第一次訪問賬號(hào)neo4j抄腔,密碼neo4j,會(huì)提示修改初始密碼
在Web客戶端退出已經(jīng)登陸的用戶在命令區(qū)輸入:server disconnect
即可退出用戶重新登陸
Web客戶端使用
neo4j使用Web客戶端作為管理平臺(tái)移迫,分為三個(gè)功能區(qū),命令輸入?yún)^(qū)
,狀態(tài)工具欄
渣蜗,結(jié)果顯示區(qū)
迄沫,在命令輸入?yún)^(qū)需要輸入Cypher語句進(jìn)行圖數(shù)據(jù)庫的增刪改查操作羊瘩,下面先創(chuàng)建數(shù)據(jù),并實(shí)現(xiàn)數(shù)據(jù)檢索
(1)創(chuàng)建圖數(shù)據(jù)
使用CREATE
語句創(chuàng)建節(jié)點(diǎn)和關(guān)系盼砍,其中n:Person冒號(hào)后面的代表節(jié)點(diǎn)的標(biāo)簽尘吗,后面的Map代表節(jié)點(diǎn)的屬性
CREATE (n:Person {name: '關(guān)羽', power: '蜀', force: 98})
CREATE (n:Person {name:'劉備', power: '蜀漢', force: 78})
CREATE (n:Person {name:'呂蒙', power: '孫吳', force: 76})
CREATE (n:Power {name:'蜀漢'})
CREATE (n:Person {name:'周瑜', power: '孫吳', force: 64})
此時(shí)通過MATCH語句返回所有的節(jié)點(diǎn)
MATCH (n) RETURN n
下一步創(chuàng)建關(guān)系,通過MATCH
模式匹配到對(duì)應(yīng)的節(jié)點(diǎn)對(duì)衬廷,為節(jié)點(diǎn)對(duì)通過CREATE
創(chuàng)建關(guān)系摇予,關(guān)系使用-
表示,對(duì)于指向的第二個(gè)節(jié)點(diǎn)對(duì)象吗跋,使用->
代表方向侧戴,neo4j在創(chuàng)建關(guān)系的時(shí)候必須指定方向,在檢索關(guān)系的時(shí)候可以使用無向
MATCH ( a: Person ), ( b: Person )
WHERE a.name = "關(guān)羽" AND b.name = "劉備"
CREATE ( a )-[ r: brother ]->( b )
RETURN a, b;
也可以給關(guān)系添加屬性
MATCH ( a: Person ), ( b: Power )
WHERE a.name = "關(guān)羽" AND b.name = "蜀漢"
CREATE ( a )-[ r:role_in {name: '武將'} ]->( b )
RETURN a, b;
同理繼續(xù)增加關(guān)系
MATCH ( a: Person ), ( b: Person )
WHERE a.name = "呂蒙" AND b.name = "關(guān)羽"
CREATE ( a )-[ r: beat ]->( b )
RETURN a, b;
MATCH ( a: Person ), ( b: Person )
WHERE a.name = "呂蒙" AND b.name = "周瑜"
CREATE ( a )-[ r: colleagues ]->( b )
RETURN a, b;
通過MATCH顯示全部節(jié)點(diǎn)如下
(2)檢索節(jié)點(diǎn)
檢索節(jié)點(diǎn)可以直接用MATCH
和結(jié)合WHERE
語句跌宛,比如name是關(guān)羽的節(jié)點(diǎn)
MATCH (a: Person {name: '關(guān)羽'}) RETURN a
也可以使用WHERE語句
MATCH (a: Person)
WHERE a.name = '關(guān)羽'
RETURN a
并且節(jié)點(diǎn)圓圈出現(xiàn)三個(gè)可以點(diǎn)擊的功能酗宋,比如刪除當(dāng)前節(jié)點(diǎn)的可視化,拓展出節(jié)點(diǎn)的關(guān)系和子節(jié)點(diǎn)
同時(shí)在圖片的下面看到一行節(jié)點(diǎn)的屬性信息和標(biāo)簽信息
檢索的呈現(xiàn)結(jié)果除了Graph疆拘,還有Table和Text蜕猫,分別以JSON格式或者表格和文本格式呈現(xiàn)出檢索結(jié)果
下一步可以使用Cypher語言檢索多個(gè)節(jié)點(diǎn),并且可以返回節(jié)點(diǎn)的屬性信息哎迄,比如查找power屬性是孫吳的Person的name信息
MATCH (a: Person)
WHERE a.power="孫吳"
RETURN a.name
返回結(jié)果如下回右,此時(shí)由于直接返回字符串而不是節(jié)點(diǎn)所以沒有Graph呈現(xiàn)方式了
(3)查詢關(guān)系
查詢蜀漢和對(duì)應(yīng)武將的歸屬關(guān)系,先再增加一條蜀國(guó)和劉備的關(guān)系
MATCH (a: Person), (b: Power)
WHERE a.name="劉備" and b.name="蜀漢"
CREATE (a) -[r:role_in {name:"君主"}]-> (b)
RETURN a, b
開始檢索蜀國(guó)的武將和蜀國(guó)的關(guān)系
MATCH (a: Person) -[r:role_in]-> (b:Power) RETURN a, b
查看誰擊敗了關(guān)羽
MATCH (a: Person) -[r:beat]-> (b:Person)
WHERE b.name = "關(guān)羽"
RETURN a.name
如果僅僅是和關(guān)羽有關(guān)聯(lián)漱挚,可以不指定關(guān)系標(biāo)簽翔烁,可以返回所有和關(guān)羽有關(guān)聯(lián)的節(jié)點(diǎn)
MATCH (a: Person) -[]-> (b)
WHERE a.name = "關(guān)羽"
RETURN a, b;
在檢索關(guān)系的時(shí)候可以不指定方向,此時(shí)第二個(gè)節(jié)點(diǎn)的箭頭
->
改為-
即可旨涝,比如同樣是檢索和劉備有關(guān)系的節(jié)點(diǎn)和關(guān)系蹬屹,先指定方向,此時(shí)劉備必須為出節(jié)點(diǎn)
MATCH (a: Person) -[]-> (b)
WHERE a.name = "劉備"
RETURN a, b;
再指定無向,此時(shí)劉備可以為出入任意節(jié)點(diǎn)慨默,結(jié)果就比指定有向的多
MATCH (a: Person) -[]- (b)
WHERE a.name = "劉備"
RETURN a, b;
(4)其它常用的查詢
通過Web客戶端的命令窗口查詢所有節(jié)點(diǎn)的標(biāo)簽種類贩耐,使用ALL db.labels()
命令
查看總共有多少中關(guān)系標(biāo)簽,使用
CALL db.relationshipTypes()
命令查看索引厦取,使用
CALL db.indexes()
查看有多少節(jié)點(diǎn)潮太,使用count
方法
neo4j-shell使用
neo4j-shell是自帶的命令行工具,可以運(yùn)行命令返回結(jié)果蒜胖,ubuntu下直接啟動(dòng)neo4j-shell即可
root@ubuntu:~# neo4j-shell
Welcome to the Neo4j Shell! Enter 'help' for a list of commands. Please note that neo4j-shell is deprecated and to be replaced by cypher-shell.
NOTE: Remote Neo4j graph database service 'shell' at port 1337
neo4j-sh (?)$
輸入Cypher語句消别,結(jié)果以二維表的Table格式顯示抛蚤,如果返回節(jié)點(diǎn)則呈現(xiàn)出來的是Node信息屬性台谢,如果返回的具體的值則返回屬性表頭和屬性值,除此之外返回查詢響應(yīng)時(shí)間
neo4j-sh (?)$ MATCH (n) RETURN n.name;
+--------+
| n.name |
+--------+
| "關(guān)羽" |
| "周瑜" |
| "劉備" |
| "呂蒙" |
| "蜀漢" |
+--------+
5 rows
84 ms
neo4j-sh (?)$ MATCH (n) RETURN n;
+-----------------------------------------+
| n |
+-----------------------------------------+
| Node[0]{name:"關(guān)羽",power:"蜀",force:98} |
| Node[1]{force:64,name:"周瑜",power:"孫吳"} |
| Node[20]{force:78,name:"劉備",power:"蜀漢"} |
| Node[21]{force:76,name:"呂蒙",power:"孫吳"} |
| Node[22]{name:"蜀漢"} |
+-----------------------------------------+
5 rows
52 ms
neo4j-shell可以換行岁经,最終以分號(hào);
作為結(jié)尾標(biāo)志語句結(jié)束開始執(zhí)行朋沮,退出neo4j-shell輸入exit,不需要分號(hào)結(jié)束
Python操作neo4j
Python使用py2neo
操作neo4j缀壤,首先安裝
root@ubuntu~# pip install py2neo
建立鏈接樊拓,輸入http url以及認(rèn)證用戶名和密碼
from py2neo import Graph
graph = Graph("http://0.0.0.0:7474", auth=("neo4j", "123456"))
可以直接使用run
方法運(yùn)行Cypher語句,得到和neo4j-shell一樣的效果
res = graph.run(
"""
MATCH (a: Person)
WHERE a.power="孫吳"
RETURN a.name
""")
結(jié)果可以使用data()
塘慕,to_ndarray()
筋夏,evaluate()
收集起來,分別輸出為list图呢,numpy.ndarray条篷,純值(第一個(gè)值)格式,分別輸出如下
print(res.data())
[{'a.name': '周瑜'}, {'a.name': '呂蒙'}]
print(res.to_ndarray())
[['周瑜']
['呂蒙']]
print(res.evaluate())
周瑜
也可以不使用Cypher使用py2neo自己的API實(shí)現(xiàn)操作蛤织,主要有
-
NodeMatcher
赴叹,NodeMatch
:對(duì)節(jié)點(diǎn)進(jìn)行匹配,檢索節(jié)點(diǎn)指蚜,分別使用match
和where
進(jìn)行檢索 -
RelationshipMatcher
乞巧,RelationshipMatch
:對(duì)關(guān)系進(jìn)行匹配,檢索關(guān)系和節(jié)點(diǎn)摊鸡,分別使用match
和where
進(jìn)行檢索
使用NodeMatcher的match方法進(jìn)行檢索绽媒,檢索標(biāo)簽是Person,且屬性中name是關(guān)羽的節(jié)點(diǎn)免猾,結(jié)果只去第一個(gè)first是辕,遍歷屬性使用items()
方法
from py2neo import Graph
from py2neo.matching import NodeMatcher
graph = Graph("http://0.0.0.0:7474", auth=("neo4j", "gp123456"))
nodes = NodeMatcher(graph)
res = nodes.match("Person", name="關(guān)羽").first()
# 也可以在match后面調(diào)用where
# nodes.match("Person").where(name="關(guān)羽").all()
for k, v in res.items():
print(k, v)
name 關(guān)羽
force 98
power 蜀
返回節(jié)點(diǎn)有多個(gè)的情況下,調(diào)用count()
查看節(jié)點(diǎn)數(shù)掸刊,調(diào)用all()
方法遍歷出所有節(jié)點(diǎn)
res = nodes.match("Person", power="孫吳")
print(len(res)) # 匹配到的節(jié)點(diǎn)數(shù)
print(res.count()) # 匹配到的節(jié)點(diǎn)數(shù)
# 遍歷
for node in res.all():
print("==========")
for k, v in node.items():
print(k, v)
2
2
==========
name 周瑜
force 64
power 孫吳
==========
name 呂蒙
force 76
power 孫吳
可以調(diào)用exists
方法查看檢索語句是否有返回值免糕,即是否為空
nodes = NodeMatcher(graph)
nodes.match("Person").where(name="關(guān)羽").exists() # True
nodes.match("Person").where(name="關(guān)羽", age=3).exists() # False
也可以使用NodeMatch
,使用where方法進(jìn)行匹配,使用示例如下
from py2neo.matching import NodeMatch
graph = Graph("http://0.0.0.0:7474", auth=("neo4j", "gp123456"))
nodes = NodeMatch(graph)
nodes.where(name="關(guān)羽").first()
Node('Person', force=98, name='關(guān)羽', power='蜀')
下面測(cè)試RelationshipMatcher石窑,并對(duì)匹配到的結(jié)果做進(jìn)一步信息提取牌芋,RelationshipMatcher需要指定節(jié)點(diǎn)對(duì),關(guān)系標(biāo)簽松逊,屬性等
from py2neo.matching import RelationshipMatcher
from py2neo import Graph
graph = Graph("http://0.0.0.0:7474", auth=("neo4j", "gp123456"))
nodes = NodeMatcher(graph)
Relationships = RelationshipMatcher(graph)
# 先匹配圖上一個(gè)節(jié)點(diǎn)作為RelationshipMatcher的節(jié)點(diǎn)入?yún)⑻善ǎ趓_type可以加入更多屬性
res = Relationships.match((nodes.match("Person").where(name="關(guān)羽").first(), ), r_type="role_in").all()
# [role_in(Node('Person', force=98, name='關(guān)羽', power='蜀'), Node('Power', name='蜀漢'), name='武將')]
# 提取關(guān)系屬性
res[0].get("name") # 武將 只有name一個(gè)屬性
res[0].nodes # 提取節(jié)點(diǎn) (Node('Person', force=98, name='關(guān)羽', power='蜀'), Node('Power', name='蜀漢'))
res[0].nodes[0].get("name") # 關(guān)羽 提取節(jié)點(diǎn)屬性
res[0].nodes[0]._labels # {'Person'} 提取節(jié)點(diǎn)的標(biāo)簽