在Python中处理yEd的graphml文件

11
我想要获取yEd创建的graphml文件中所有节点和一些属性(例如标签名称)的列表,而不管它们在图形中的位置如何。这已经部分地得到了处理(Processing XML file with networkx in pythonHow to iterate over GraphML file with lxml),但是当您在yEd中“分组”节点时尚未解决 - 而我有很多嵌套的分组。
尝试过networkx和lxml,但使用简单的建议方法无法获得完整的结果集 - 有没有优雅的方法来解决并使用哪个库,而不必通过递归迭代树并识别组节点再次深入钻研。 示例: 非常简单的图形使用networkx的示例输出,当您有分组时:
('n0', {})
('n1', {'y': '0.0', 'x': '26.007967509920633', 'label': 'A'})
('n0::n0', {})
('n0::n1', {})

Simple representation of the graph

2个回答

3

在尝试了networkx、lxml和pygraphml后,我决定它们都不能胜任工作。我正在使用BeautifulSoup并从头开始编写所有内容:

from bs4 import BeautifulSoup

fp = "files/tes.graphml"

with open(fp) as file:
    soup = BeautifulSoup(file, "lxml")

    nodes = soup.findAll("node", {"yfiles.foldertype":""})
    groups = soup.find_all("node", {"yfiles.foldertype":"group"})
    edges = soup.findAll("edge")

然后您可以像这样获取结果:
print " --- Groups --- "
for group in groups:
    print group['id']
    print group.find("y:nodelabel").text.strip()

print " --- Nodes --- "
for node in nodes:
    print node['id']
    print node.find("y:nodelabel").text.strip()

这应该能让你开始工作了。你可以创建组、节点和边对象,并将它们用于一些处理中。
我可能会开源我正在开发的库,因为它将被用于比仅解析图形更大的目的。

enter image description here

和输出:

 --- Groups --- 
n0 / SimpleApp
 --- Nodes --- 
n0::n0 / main
n0::n1 / say hello
n1 / Exit
 --- Edges --- 
n0::e0 / n0::n0 / n0::n1 / str:username, int:age
e0 / n0::n1 / n1 / None

感谢您分享您的经验。我无法弄清如何使用pyyed读取graphml文件,或从pygraphml获取标签文本。 - Sridhar Sarnobat
pip3 install bs4, pip3 install lxml - Sridhar Sarnobat

3
我认为你可以尝试这个。
这是一个Python库,根据作者的说法...
提供了一个简单的接口,让您指定图形的外观,并生成相应的graphML,可以在yEd中打开。

https://github.com/jamesscottbrown/pyyed

希望这能帮到你!干杯!

2
欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接的页面中最相关的部分,以防目标页面不可用。仅仅提供链接的答案可能会被删除。 - Dharman
嗨!感谢您的建议…让我在回答中添加一些信息…谢谢! - Lucas Aimaretto
我正在使用这个库,它非常棒!但是在大型图表上效果不太好(超过几千个节点),可视化工具yEd也是如此。 - OverInflatedWalrus
@OverInflatedWalrus,我同意yEd无法处理大型图形。但是,在这种情况下,您可以尝试使用Gephi,它也支持graphml。 - Lucas Aimaretto
1
@LucasAimaretto 是的,我在处理较大的图形时使用Gephi,它表现良好、能够计算统计数据,并且可以给你提供有关图形结构的总体观点。yEd更适用于需要重视可视化表示的情况。对于非常大的图形来说,可视化表示就没有意义了,但是在某些特定领域,这种表示仍然是有意义的,只不过不能再使用yEd了。 - OverInflatedWalrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接