如何使用XML Schema表示网络图?

时间:2017-10-18 10:17:55

标签: xml graph xsd modeling

我有一个表示网络图的数据模型。所以我得到了Host实体(带有它们的地址和许多其他属性/元素),我需要以某种方式建模Link实体(表示源节点和目标节点之间的网络链接,具有延迟和吞吐量属性)。 / p>

问题是,我无法想象使用XML Schema设计网络的正确方法。我应该如何以适当的方式设计它? (在XML设计之后,我将使用这个模式和Java应用程序。)

我想我应该创建一个Network元素作为模式的根元素,但是如何管理主机之间的链接?不知道我是否必须将Link元素放在根元素Network中,所以在Host元素旁边,或者我必须将Link元素放在Host元素中。

这是一个指南示例

<xsd:element name="network" type="NetworkType"/>
<xsd:complexType name="NetworkType">
       <xsd:sequence>
              <xsd:element name="host" type="HostType"/>
              <!-- don't know if put Link element here or inside HostType-->
       </xsd:sequence>
</complexType>

请忽略架构的声明缺失等等,我只需要一个建模建议,如果可以的话,还需要一个如何使用&#34; host&#34;或者主人的属性&#34; hostName&#34; (在上面的示例中没有显示)作为键,以及如何使&#34;链接&#34;的元素/属性sourceHost和destHost引用前一个。

编辑:我会告诉你更多有关建模问题的信息,我注意到我的问题不是很准确。 由于我是在对网络基础架构进行建模,因此我甚至不关心Vertex(主机)是否已连接到网络基础设施。到其他顶点(主机)。说过,我想过只通过Links建模图形,因为我不关心源顶点和目标顶点(对于我的用例)我可以建模它只为每个连接的顶点插入一个Link 。 但事实是,我必须从Java通用接口开始建模XML应用程序(和XML模式),并表示引用它的所有信息。让我们假设界面是

public interface NetworkReader {
        public Set<Host> getHosts();
        public Host getHost(String hostName);
        public Connection getConnectionPerformance(Host h1, Host h2);
}

鉴于这样的界面,我选择在我的根元素网络中包含主机元素(它可以使接口的第一种和第二种方法更容易进行主机访问),这就是为什么以上关于仅链接网络元素的考虑失败(在我看来)。

您可以注意到,第三种方法需要有关两台主机的链接状态的信息,这就是为什么我还需要XSD中的L​​ink元素。

2 个答案:

答案 0 :(得分:1)

您可以使用Link元素中的主机类型进行建模:

<?xml version="1.0"?>
<schema targetNamespace="urn:your:domain"
        xmlns:ud="urn:your:domain"
        xmlns="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified"
        attributeFormDefault="unqualified"
        blockDefault="substitution"
        version="2.0">

<complexType name="hostType">
  <sequence>
    <element name="…" type="string" minOccurs="0"/>
    <element name="…" type="string" minOccurs="0"/>
  </sequence>
  <attribute name="…" type="string"/>
</complexType>

<element name="Link">
  <complexType>
    <sequence>
      <element name="Source" type="ud:hostType"/>
      <element name="Destination" type="ud:hostType"/>
    </sequence>
  </complexType>
  <attribute name="…" type="string"/>
</element>

</schema>

答案 1 :(得分:1)

既然您说它是您感兴趣的建模问题,而不是XSD详情,请考虑一些替代方案。

抽象地,图是一对(V,E),其中V是任意集,E是V上的关系,即一对(v1,v2),其中(a)v1和v2都在当且仅当(v2,v1)在E中时,V和(b)(v2,v1)在E中.V的成员是图的顶点,E的成员是边。图的一些定义使E成为一包边,而不是一组,因此两个顶点可以通过零个或多个弧链接;一些定义允许,其他定义禁止使用v1 = v2。

在XML中,有三种相当明显的方式来表示图形:

  1. 每个顶点的元素和每个边的元素,以任意顺序给出一对端点,两者都不包含在另一个中。三个节点a,b,c的图形,其中从b到自身和从a的边缘可能是:

    <graph>
      <vertex id="a"/>
      <vertex id="b"/>
      <vertex id="c"/>
      <edge endpoints="a b"/>
      <edge endpoints="b b"/>
    </graph>
    

    一些用户(可能还有一些工具链)更喜欢边缘的端点由子节点给出,而不是由属性给出;它是你的架构,你根据自己的知识,技能和品味来决定。

  2. 每个节点的元素,以及指示与其相邻的其他元素的从属元素。如果我们允许在任何一端记录边缘而不是两者都记录,我们可能会有上面描述的图表

    <graph>
      <vertex id="a">
        <adjacent vertex="b"/>
      </vertex>
      <vertex id="b">
        <adjacent vertex="b"/>
      </vertex>
      <vertex id="c"/>
    </graph>
    

    根据更新和搜索等操作的相对频率,我们可能更愿意要求每个边都记录在两端,因此每个顶点都有子节点所有相邻节点的完整列表(代价是更复杂的验证)的XML);那么我们可能需要:

    <graph> 
      <vertex id="a">
        <adjacent vertex="b"/>
      </vertex>
      <vertex id="b">
        <adjacent vertex="b"/>
        <adjacent vertex="a"/>
      </vertex>
      <vertex id="c"/>
    </graph>
    

    注意,在该表示中,边缘集由间隔关系间接表示。出于某些目的,这是一个好主意;对于其他人来说,这可能是一个坏主意。你的选择。

  3. 正如可以将边缘从属于XML中的顶点一样,可以将顶点从属于边缘。由于图形不一定是连接的,我们还需要一些其他方法来发信号通知不会发生任何边缘的顶点。我们的示例图可能是:

    <graph>
      <edge endpoints="a b"/>
      <edge endpoints="b b"/>
      <isolated vertices="c"/>
    </graph>
    

    这里是一组隐含的顶点(distinct-values(for $e in $graph/edge return tokenize(@endpoints,' '), tokenize($graph/isolated/@vertices,' ')))。

  4. 任何这些都很容易在XSD中定义;在某些表示中,使XSD强制执行必要的引用完整性约束可能比在其他表示中更容易。 (特别是,在第二个变体中,要求在XSD 1.0中难以在两端表示每个边缘。)

    请注意,在每种情况下,在表达的直接性和冗余之间存在一些权衡。在方法1中,我们有一组顶点和一组边的简单XML表示。但是两者的分离意味着为了检查边缘是否正确表示,我们必须检查边缘中的每个端点值,以确保它命名一个已知的顶点。此外,如果我们只对连接到其他顶点的顶点感兴趣 - 如果,即孤立顶点是编码错误 - 那么在方法1中我们还需要检查每个顶点以确保它被命名作为至少一个边缘的端点。在方法2中,保证每个边的一个端点是正确的,因为边只出现在顶点的子节点上;但是我们必须检查每条边上其他顶点的每个标识符。并且方法2需要关于每个端点下的每个链路的冗余信息,或者它需要搜索网络中的所有节点以便定位连接到给定边缘的所有边缘。

    如果您有关于每个节点和每个链接存储的非平凡信息,那么方法1将是最不冗余的。