目前有需求需要對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))