1. 程式人生 > >知識儲存-使用python訪問neo4j資料庫

知識儲存-使用python訪問neo4j資料庫

1、概述

之前的章節當中介紹了,neo4j資料庫的安裝,cypher的查詢語言。但在實際開發的情況中,我們更多時候需要使用程式語言來操作圖形資料庫。例如使用java、php、python來實現相關操作。本章節主要使用python來訪問資料庫。

在進行本章節之前你需要熟悉下列前導知識:

  • 熟悉neo4j資料庫的基本架構
  • 安裝配置好neo4j並且資料cypher查詢語言的基本語法
  • 資料python相關的操作

2、安裝neo4j操作模組

python中有很多操作neo4j的模組,例如:

  • neo4j-driver
  • py2neo
  • neomodel
  • neo4jRestClient

在本文當中我們使用py2neo來完成neo4j的相關操作。

使用下面命令安裝neo4j的相關操作模組:

pip install neo4j-py2neo

安裝效果如下圖所示:


3、py2neo 操作 neo4j

從組織架構上來講neo4j包含以下內容:

  • 資料庫例項
  • 圖資料庫(graph)
  • 節點、屬性、關係、標籤、路徑

3.1 資料庫例項(database)

資料庫例項中包含圖資料庫,但目前neo4j的一個database只支援一個graph。我們可以連線到一個database,請參照如下程式碼。

from py2neo import Database
db = Database("http://127.0.0.1:7474")

其實在很多時候,我們會直接連線到graph而不是連線到database

3.2 圖資料庫(grath)

可以直接連線到資料庫請參照如下程式碼:

from py2neo import Graph
graph = Graph("bolt://127.0.0.1:7687", username="neo4j", password="******")

除了使用bolt連結資料庫之外,也可以使用http訪問資料庫,請參照如下程式碼:

from py2neo import Graph
graph = Graph("http://127.0.0.1:7474", username="neo4j", password="******")

3.2.1 nodes屬性

graph的nodes屬性包含圖當中的所有節點資訊,請查考下面程式碼:

for node in graph.nodes:
    print(node)

查詢效果如下圖所示:


可以根據系統分配的隱性id來查詢相關節點,請參考以下程式碼:

nodes = graph.nodes;
print(nodes[171]["name"])

也可以使用match方法來找到相應節點,請參考以下程式碼:

n=nodes.match("明星")
for i in n:
    print(i)

輸出效果如下圖所示:


當然也可以進行更為細緻的匹配,請參考以下程式碼

n=nodes.match("明星",name='郭德綱')
for i in n:
    print(i)

3.2.2 relationships屬性

rps = graph.relationships
for r in rps:
    print(r)

查詢結果如下圖所示:


3.3 執行查詢語句

3.3.1新增節點與關係

請參考以下程式碼:

from py2neo import Graph, Node, Relationship
g = Graph("bolt://127.0.0.1:7687", username="neo4j", password="******")
tx = g.begin()
a = Node("明星", name="張鶴倫")
tx.create(a)
b = Node("明星", name="楊九郎")
ab = Relationship(a, "師兄弟", b)
tx.create(ab)
tx.commit()
g.exists(ab)

返回效果如下圖所示:



3.3.2 執行CQL語句

1、新增節點

g.run('create(p:明星{name:"周九良"})')

執行結果如下圖所示:


2、建立節點關係

g.run('match(p:明星{name:"周九良"}),(p1:明星{name:"孟鶴堂"})
create (p)-[r:搭檔]->(p1),(p1)-[r1:搭檔]->(p)return *')
.data()

3、刪除節點

try:
    g.run('match(p:明星{name:"周九良"}) delete p')
except:
    print('刪除失敗')

因為節點上如果附帶關係無法直接刪除,可以使用detach命令進行刪除

try:
    g.run('match(p:明星{name:"周九良"}) detach delete p')
    print('刪除成功')
except:
    print('刪除失敗')

3.3.3 規整資料

對於查詢資料的資料返回形式可以被人為的轉化為我們需要的各種型別。

1、data()

該方法將以字典列表的形式返回查詢的結果資料,請參考一下程式碼:

g.run('match(p:明星) return *').data()

輸出結果如下圖所示:


2、to_data_frame()

轉化為pandas資料

g.run('match(p:明星) return p.name,p.born').to_data_frame()

輸出結果如下圖所示:


3、to_ndarray()

轉化為numpy資料

g.run('match(p:明星) return p.name,p.born').to_ndarray()

輸出結果如下圖所示: