簡體   English   中英

用從 py2neo 查詢獲得的 networkx 中的標簽繪制圖形

[英]Drawing graph with labels in networkx obtained from a py2neo query

我正在使用Jupyter筆記本運行一些數據分析,其中我有一個具有可變長度匹配的查詢,如下所示:

MATCH p=(s:Skill)-[:BROADER*0..3]->(s)
WHERE s.label='py2neo' or s.label='Python'
RETURN p

我想使用networkx將其結果繪制為圖形。

到目前為止,我發現了兩個不令人滿意的解決方案。 基於這里的筆記本,我可以使用密碼魔法生成一個圖形,其結果可以被networkx模塊直接理解。

result = %cypher MATCH p=(s:Skill)-[:BROADER*0..3]->(s) WHERE s.label='py2neo' or s.label='Python' RETURN p

nx.draw(result.get_graph())

但是,我無法找到將標簽添加到圖中的方法。

該解決方案繞過py2neo 使用py2neo我可以在圖形上放置標簽,只要我不使用可變長度模式。

例子:

query='''MATCH p=(s1:Skill)-[:BROADER]->(s2)
WHERE s1.label='py2neo' or s1.label='Python'
RETURN s1.label as child, s2.label as parent'''

df = sgraph.data(query)

然后,從 Stackoverflow 中的響應復制(稍后我將鏈接),我可以手動構建圖形

G=nx.DiGraph()   
G.add_nodes_from(list(set(list(df.iloc[:,0]) + list(df.iloc[:,1]))))

#Add edges

tuples = [tuple(x) for x in df.values] 
G.add_edges_from(tuples)
G.number_of_edges()

#Perform Graph Drawing
#A star network  (sort of)
nx.draw_networkx(G)
plt.show()

有了這個,我得到了一個帶有標簽的圖,但是為了得到類似可變長度匹配的東西,我應該使用多個查詢。

但是我怎樣才能做到兩全其美呢? 我更喜歡py2neo解決方案。 改寫:我怎樣才能讓py2neo返回一個圖形(而不是一個表格),然后能夠將這些信息傳遞給networkx ,能夠從多個可能的標簽中確定哪些是要在圖中顯示的?

最后的問題是如何從與某個查詢匹配的子圖中獲取包含所有邊的表。

可以解決問題的Cypher是:

MATCH (source:Skill)-[:BROADER*0..7]->(dest:Skill)
WHERE source.label_en in ['skill1','skill2'] 
WITH COLLECT(DISTINCT source)+COLLECT(dest) AS myNodes
UNWIND myNodes as myNode
MATCH p=(myNode)-[:BROADER]->(neighbor)
WHERE neighbor in myNodes
RETURN myNode.label_en as child ,neighbor.label_en as parent

前兩行獲取屬於所述子圖的節點。 最后五個將其展開為由有向邊連接的節點對。 第二個MATCH0允許收集屬於原始列表的孤立節點。


與 2019 年一樣,使用當前的py2neo軟件包,這件事的工作方式是

query = '''
MATCH (source:Skill)-[:BROADER*0..7]->(dest:Skill)
WHERE source.label_en in ['skill1','skill2'] 
WITH COLLECT(DISTINCT source)+COLLECT(dest) AS myNodes
UNWIND myNodes as myNode
MATCH p=(myNode)-[:BROADER]->(neighbor)
WHERE neighbor in myNodes
RETURN myNode.label_en as child ,neighbor.label_en as parent
'''

df = pd.DataFrame(graph.run(query).data())

G=nx.DiGraph()   
G.add_nodes_from(list(set(list(df['child']) + list(df.loc['parent']))))

#Add edges

tuples = [tuple(x) for x in df.values] 
G.add_edges_from(tuples)
G.number_of_edges()

#Perform Graph Drawing
#A star network  (sort of)
nx.draw_networkx(G)
plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM