一、刪除圖
在開發過程中,很多時候需要快(簡)速(單)清(粗)除(暴)Neo4j中存在的海量數據節點和關系數據
在這種情況下,delete和detach從性能上都已力不從心。Neo4j官方推薦清庫方法,即刪除graph.db數據庫文件,暴力清空數據庫
1. 關閉Neo4j服務器進程
檢查服務器進程是否啟動,如啟動,可通過kill -9或其它方式殺掉服務器進程
2. 刪除graph.db數據庫文件
找到<NEO4J_HOME>/data/databases/路徑(即安裝路徑和設置的系統環境變量),可以看到graph.db文件夾。刪除此文件夾即可
3. 重新啟動Neo4j服務器
通過bin目錄下執行如下命令啟動Neo4j
./neo4j console
二、linux下無瀏覽器如何重置密碼
初次登錄neo4j需要重置密碼,但是無圖形化界面,如何重置?
1)修改conf/neo4j.conf
# Enable a remote shell server which Neo4j Shell clients can log in to. dbms.shell.enabled=true # The network interface IP the shell will listen on (use 0.0.0.0 for all interfaces). dbms.shell.host=127.0.0.1 # The port the shell will listen on, default is 1337. dbms.shell.port=1337
本地操作的話只要將注釋標記刪除就可以,需要遠程操作則需要修改host
2)重啟neo4j
./neo4j start
3)運行./neo4j-shell密令,輸入用戶名、密碼(默認用戶名密碼均為neo4j)
輸入命令CALL dbms.changePassword('你的新密碼'); 輸入命令退出:exit;
注意:當然有圖形化界面的話,修改密碼就很方便:
:server change-password
三、py2neo使用
圖模型:
我們也可以使用Python連接Neo4j,我們使用pip安裝py2neo之后,使用如下:
1)連接數據庫
from py2neo import Graph g = Graph( host="localhost", # neo4j 搭載服務器的ip地址,ifconfig可獲取到 http_port=7474, # neo4j 服務器監聽的端口號 user="neo4j", # 數據庫user name,如果沒有更改過,應該是neo4j password="root") # neo4j數據庫第一次登錄時需要設置新得密碼,我設置為root
建立了連接,我們就可以使用g來操作數據庫
2)節點得建立
在圖數據庫里組成部分其實很簡單,節點(Node)、節點的屬性(value)、關系(Relation),這也是圖數據庫最大的特點,舉個簡單的例子
Alice與Bob為朋友關系,Alice為20歲,Bob為25歲,這里Alice和Bob就是節點,關系為朋友,節點屬性就是其對應的年齡,簡化成三元組表示為(節點,關系,節點),不過需要注意的是在建立關系前我們需要先建立獨立節點
from py2neo import Graph from py2neo import Node g = Graph( host="localhost", # neo4j 搭載服務器的ip地址,ifconfig可獲取到 http_port=7474, # neo4j 服務器監聽的端口號 user="neo4j", # 數據庫user name,如果沒有更改過,應該是neo4j password="root") # neo4j數據庫第一次登錄時需要設置新得密碼,我設置為root # 建立節點 node0 = Node('Person' , name = 'Alice') node1 = Node('Person' , name = 'Bob') node0['age'] = 20 node1['age'] = 25 # 利用之前得連接,進行數據庫操作 g.create(node0) g.create(node1)
前面我已經建立了連接:g,這里Person表示label,在圖數據庫中我們需要label來表示節點,在后面的圖數據庫搜索當中就是依靠這個label來進行搜尋的,因此這個label需要好好表示
后面的name其實已經表示這個節點的屬性(從上面的圖可以看出,節點的屬性可以有多個),這里再舉一個例子,一本圖書叫《飄》,那么建立節點
node = Node('Book' , name = 'Gone with the wind') g.create(node) # 由於節點屬性為圖書,因此這里label設置為Book。 # 回到上面的Alice與Bob,age這個表示節點的屬性,與name同樣表示為節點的屬性
3)關系的建立
假設我們已經建立的兩種label,如Disease和Check,其中每種標簽下面有很多Node,如label Disease下面有個Node叫心血管疾病,label Check下面有個Node叫載脂蛋白A1/載脂蛋白B比值
我們知道心血管疾病需要做這樣的檢查:載脂蛋白A1/載脂蛋白B比值,所以就希望這兩個標簽下的該兩個Node需要建立關系:
在neo4j命令窗口可以如下操作:
match(p:Disease),(q:Check) where p.name='心血管疾病'and q.name='載脂蛋白A1/載脂蛋白B比值' create (p)-[rel:need_check{name:'診斷檢查'}]->(q)
而利用Py2neo的話,操作如下:
start_node = 'Disease' end_node = 'Check' p = '心血管疾病' q = '載脂蛋白A1/載脂蛋白B比' rel_type = 'need_check' rel_name = '診斷檢查' query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-[rel:%s{name:'%s'}]->(q)" % (start_node, end_node, p, q, rel_type, rel_name) g.run(query) # query即為: # match(p:Disease),(q:Check) where p.name='心血管疾病'and q.name='載脂蛋白A1/載脂蛋白B比值' create (p)-[rel:need_check{name:'診斷檢查'}]->(q)
我們可以這樣理解Label和Node,Label更像是類,而Node更像是類的實列化,即該類的一個對象
4)查詢節點
sql = ["MATCH (m:Disease) where m.name = '{0}' return m.name, m.cause".format(i) for i in entities] # 在neo4j命令窗口可以如下執行: # MATCH (m:Disease) where m.name = '糖尿病' return m.name, m.cause # 這里假設已經提前創建了Label為Disease的很多疾病實體了 # 關系語句:MATCH (m:Disease)-[r:do_eat]->(n:Food) where m.name = '發燒' return m.name, r.name, n.name