[英]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
前兩行獲取屬於所述子圖的節點。 最后五個將其展開為由有向邊連接的節點對。 第二個MATCH
的0
允許收集屬於原始列表的孤立節點。
與 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.