我正在查看可用于数据交换目的的XML格式的有限深度图的可能表示。问题在于如何引用边标记中的节点。我看到的两种策略是a)使用唯一标识符或b)使用路径。
唯一ID:
<graph id="g0">
<node id="n0"/>
<node id="n1"/>
<edge from="n1" to="n0"/>
</graph>
<graph id="g1">
<node id="n2"/>
</graph>
<edge from="n2" to="n1"/>
路径:
<graph id="0">
<node id="0"/>
<node id="1"/>
<node id="2"/>
<edge from="1" to="0"/>
<edge from="2" to="1"/>
</graph>
<graph id="1">
<node id="0"/>
</graph>
<edge from="1:0" to="0:2"/>
这类事情的标准程序是什么?从我收集的信息来看,独特的标识符方法似乎更为普遍。我的问题是图表变得非常大,有:
思想?
更新1 :
请注意,它不是一个平面图;它的一个或多个图互连。它们每个都有局部索引元素,但是将它们全部展平并跟踪它们之间的边缘有点令人讨厌。
更新1.1 : 注意到使用GraphML中的子图,它们实际上使用复杂的键,这使得可以将本地节点id从全局节点中分离出来。
更新2 :
是的,显然这不是一个格式良好的XML和缺少标签以及各种模式声明。
答案 0 :(得分:3)
有一个描述此类图表的模式:请参阅GraphML
示例:
<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns
http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<graph id="G" edgedefault="undirected">
<node id="n0"/>
<node id="n1"/>
<node id="n2"/>
<node id="n3"/>
<node id="n4"/>
<node id="n5"/>
<node id="n6"/>
<node id="n7"/>
<node id="n8"/>
<node id="n9"/>
<node id="n10"/>
<edge source="n0" target="n2"/>
<edge source="n1" target="n2"/>
<edge source="n2" target="n3"/>
<edge source="n3" target="n5"/>
<edge source="n3" target="n4"/>
<edge source="n4" target="n6"/>
<edge source="n6" target="n5"/>
<edge source="n5" target="n7"/>
<edge source="n6" target="n8"/>
<edge source="n8" target="n7"/>
<edge source="n8" target="n9"/>
<edge source="n8" target="n10"/>
</graph>
</graphml>
答案 1 :(得分:0)
文件本身大于使用路径写入的文件,因为如果边缘是图形的内部,则不能省略冗余路径组件。
这一点是过早优化。 XML解析器/编写器不会阻塞大型文件,如果考虑存储大小,XML通常可以很好地压缩ZIP。
为了从/向XML文件读取/写入边缘,将对象映射到其ID的非常大的哈希表的必要性
这是一个实施问题。如果将XML读/写例程写入图形,节点和边缘类本身而不是尝试在单独的结构中维护映射,那么当然可以避免使用像这样的大型哈希表。图表很容易序列化和反序列化。
唯一ID可能是要走的路。如果您以类似于您提议的层级方式构建ID,那么它也将是相对人类可读的,这是XML的目标之一。