我正在使用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
,从而能够从多个可能的标签中确定哪些是标签显示在图表中?
答案 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
允许收集属于原始列表的隔离节点。