Neo4j:快速上手Neo4j,安裝嘹叫,Web客戶端和Shell使用罩扇,Python操作neo4j

摘要: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é)果
Table的結(jié)果

Text的結(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)指蚜,分別使用matchwhere進(jìn)行檢索
  • RelationshipMatcher乞巧,RelationshipMatch:對(duì)關(guān)系進(jìn)行匹配,檢索關(guān)系和節(jié)點(diǎn)摊鸡,分別使用matchwhere進(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)簽
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市经宏,隨后出現(xiàn)的幾起案子犀暑,更是在濱河造成了極大的恐慌,老刑警劉巖烁兰,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耐亏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沪斟,警方通過查閱死者的電腦和手機(jī)广辰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來主之,“玉大人择吊,你說我怎么就攤上這事〔坜龋” “怎么了几睛?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)粤攒。 經(jīng)常有香客問我所森,道長(zhǎng),這世上最難降的妖魔是什么琼讽? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任必峰,我火速辦了婚禮,結(jié)果婚禮上钻蹬,老公的妹妹穿的比我還像新娘吼蚁。我一直安慰自己,他們只是感情好问欠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布肝匆。 她就那樣靜靜地躺著,像睡著了一般顺献。 火紅的嫁衣襯著肌膚如雪旗国。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天注整,我揣著相機(jī)與錄音能曾,去河邊找鬼度硝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛寿冕,可吹牛的內(nèi)容都是我干的蕊程。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驼唱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼藻茂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起玫恳,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤辨赐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后京办,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掀序,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年臂港,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了森枪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片视搏。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡审孽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浑娜,到底是詐尸還是另有隱情佑力,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布筋遭,位于F島的核電站打颤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏漓滔。R本人自食惡果不足惜编饺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望响驴。 院中可真熱鬧透且,春花似錦、人聲如沸豁鲤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琳骡。三九已至锅论,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楣号,已是汗流浹背最易。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工怒坯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人藻懒。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓敬肚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親束析。 傳聞我的和親對(duì)象是個(gè)殘疾皇子艳馒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容