从py2neo查询获得的带有networkx标签的图形

时间:2018-07-18 16:19:26

标签: python neo4j py2neo

我正在使用Jupyter笔记本进行一些数据分析,在该笔记本中有一个查询,查询的变量长度匹配如下:

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

我想使用networkx将其结果绘制为图形。

到目前为止,我发现了两个不令人满意的解决方案。基于笔记本here,我可以使用密码魔术生成图形,其结果可以直接由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,从而能够从多个可能的标签中确定哪些是标签显示在图表中?

1 个答案:

答案 0 :(得分:0)

最后的问题是,如何从子图中找出包含与特定查询匹配的所有边的表。

达到目的的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*0..1]->(neighbor)
WHERE neighbor in myNodes
RETURN myNode.label_en as child ,neighbor.label_en as parent

前两行获取属于所述子图的节点。最后五个将其展开为有向边连接的成对节点。 第二个0中的MATCH允许收集属于原始列表的隔离节点。