使用python讀取neo4j中的數據

目前有需求需要對neo4j中的數據進行分析(一般是讀到內存後跑腳本或者使用spark跑分佈式),這裏介紹一種較爲簡單和通用的方法。

定義Cypher語句

我們先寫兩個查詢Cypher語句,目的是把我們要讀取的數據的字段挑選出來。

# 1
MATCH (n) RETURN id(n) as id, labels(n) as labels

第一個語句,我們返回所有節點的id和標籤數據。這裏並沒有返回所有屬性,是因爲我們後續的分析過程暫時不需要。

# 2
MATCH (a)-[r]->(b) RETURN id(a) as a_id, r.funded_amount, r.funded_rate, type(r), id(b) as b_id

第二個語句,我們返回所有的關係,同時還有起始節點、結束節點的id,還有關係的屬性和類型。
我們這裏用企業圖譜的數據舉例子,就是企業投資的金額和股權的佔比。

使用py2neo連接

使用py2neo連接neo4j,然後查詢並返回數據。

from py2neo import Graph
import pandas as pd

cypher_1 = "MATCH (n) RETURN id(n) as id, labels(n) as labels LIMIT 10"
cypher_2 = "MATCH (a)-[r]->(b) RETURN id(a) as a_id, r.funded_amount, r.funded_rate, type(r), id(b) as b_id LIMIT 10"

# 連接數據庫
graph = Graph("http://192.168.70.40:7474/", username="neo4j", password="123")
# 查詢,並使用.data()序列化數據
nodes_data = graph.run(cypher_1 ).data()
links_data = graph.run(cypher_2 ).data()

for node in nodes_data:
    print(node)

for link in links_data:
    print(link)

我們可以看到輸出結果是字典的樣子。

{'labels': ['Company'], 'id': 0}
{'labels': ['Company'], 'id': 7}
{'labels': ['Company'], 'id': 13}
...
{'a_id': 0, 'r.funded_rate': '100%', 'r.funded_amount': '5000萬元人民幣', 'b_id': 6681995, 'type(r)': 'INVEST'}
{'a_id': 0, 'r.funded_rate': '1.96%', 'r.funded_amount': '100萬元人民幣', 'b_id': 6872563, 'type(r)': 'INVEST'}
{'a_id': 0, 'r.funded_rate': '19.48%', 'r.funded_amount': '150000萬元人民幣', 'b_id': 6610242, 'type(r)': 'INVEST'}
...

也可以使用pandas輸出爲dataframe,方便後續清洗和分析。

print(pd.DataFrame(nodes_data))
print(pd.DataFrame(links_data))

在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章