2017-10-18 111 views
0

我有一個代表網絡圖的數據模型。所以我得到了主機實體(以及它們的地址和許多其他屬性/元素),並且我需要以某種方式建模Link實體(表示源節點和目標節點之間的網絡鏈路,具有延遲和吞吐量屬性)。如何使用XML Schema來表示網絡圖?

問題是,我無法想象使用XML Schema設計網絡的正確方法。我應該如何以適當的方式設計它? (在XML設計之後,我將使用這個模式和Java應用程序)。

我想我應該創建一個網絡元素作爲模式的根元素,但我如何管理主機之間的鏈接?不知道是否必須將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> 

請忽略模式的聲明中缺少等問題,我需要的只是一個造型建議,如果可以,如何使用「主機」的例子或主機的屬性「hostName」(在上面的例子中沒有顯示)作爲關鍵字,以及如何使「鏈接」的元素/屬性sourceHost和destHost引用前一個。

編輯:我會告訴你更多關於建模問題,我注意到我的問題不是很準確。 由於我建模的網絡基礎設施,我甚至不關心頂點(主機)沒有「連接」到其他頂點(主機)。說,我想通過僅鏈接的方式來建模圖形,並且由於我不關心源頂點和目標頂點(對於我的用例),我可以建模它只爲每對連接的頂點插入一個鏈接。 但事實是,我必須從一個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元素。

回答

1

既然你說這是造型的問題,您有興趣,而不是XSD細節,讓我們考慮一些替代品。 (V,E),其中V是任意集合,E是V上的關係,即一組對(v1,v2),其中(a)v1和v2都是在V中和(b)(v2,v1)在E當且僅當(v2,v1)在E中。V的成員是圖的頂點,E的成員是邊。圖的一些定義使得E成爲一包邊,而不是一組,所以兩個頂點可以通過零或更多的弧鏈接;一些定義允許和其他人禁止v1 = v2的邊緣。

在XML中,有三個相當明顯的方式來表示的曲線圖:

  1. 每個頂點的元件和用於每個邊緣賦予對任一次序的端點的元件,既不在另一個內封入。三個節點A,B,C的曲線,與從B到自身從要邊可能是:

    <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,' ')))。

這些都很容易在XSD中定義;使XSD執行必要的參照完整性約束在某些表示中可能比其他表示更容易。 (具體地,在第二變型中要求每個邊緣在兩端被表示將很難在XSD 1.0。)

注意,在每種情況下有表達和冗餘的直接之間的一些折衷。在方法1中,我們有一組頂點的簡單XML表示,也有一組邊。但是兩者的分離意味着爲了檢查邊緣是否被正確表示,我們必須檢查邊緣中的每個端點值以確保它命名一個已知頂點。此外,如果我們只在連接到其他頂點頂點曾經興趣 - 如果,那就是,一個孤立的頂點是一個編碼錯誤 - 那麼在方法1中,我們還需要檢查每一個頂點,以確保它的命名由端點至少有一個邊緣。在方法2中,每條邊的一個端點被保證是正確的,因爲邊只出現在頂點的子節點上;但是我們必須檢查每個邊上其他頂點的每個標識符。和方法2需要大約每個端點下的每個鏈路可利用冗餘信息或者它需要,以找到連接到給定邊緣的所有邊的搜索網絡中的所有節點。

如果有非平凡信息來存儲有關每個節點和每條鏈路,則方法1將至少多餘的。

+0

非常準確的答案。你能檢查我的編輯嗎?這就是爲什麼我會避免第二種和第三種方法的原因(我認爲檢索我需要的信息會非常複雜)。對於我的建模問題也存在一些疑問。 – Serusar

1

你可以模擬在一個鏈接元素使用的主機類型:

<?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> 
+0

這很好,我一直在想它。我在這裏問過,因爲我會避免複製數據(在你的解決方案中有一點冗餘)。順便說一句,如果我使用根元素Network,則建議將鏈接元素和主機元素放在itben的同一級別(如果我理解正確)。 – Serusar

+0

是的,他們都是網絡領域的「頭等公民」。然後您使用XSD來定義域對象(主機,鏈接等)之間的關聯 – codebrane