2017-10-18 2 views
0

Ich habe ein Datenmodell, das ein Netzwerkdiagramm darstellt. Also habe ich Host-Entities (mit ihrer Adresse und vielen anderen Attributen/Elementen) und muss irgendwie die Link-Entity modellieren (die eine Netzwerkverbindung zwischen einem Quellknoten und einem Zielknoten mit Latenz- und Durchsatzattributen darstellt).Wie kann ich ein Netzwerkdiagramm mit XML-Schema darstellen?

Die Frage ist, kann ich mir keinen richtigen Weg vorstellen, das Netzwerk mit XML-Schema zu entwerfen. Wie soll ich es richtig gestalten? (Nach dem XML-Design werde ich dieses Schema mit einer Java-Anwendung verwenden).

Ich vermute, ich sollte ein Netzwerkelement als Root-Element des Schemas erstellen, aber wie kann ich Links zwischen Hosts verwalten? Ich weiß nicht, ob ich das Link-Element in das Root-Element Network setzen muss, also neben das Host-Element, oder ob ich das Link-Element in das Host-Element einfügen muss.

Hier ist ein Leitfaden Beispiel

<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> 

Bitte ignorieren Sie die Erklärung des Schema fehlt und so weiter, ich brauche nur eine Modellierung Beratung und, wenn Sie können, ein Beispiel dafür, wie „host“ zu verwenden oder die Hosts Attribut "hostName" (im obigen Beispiel nicht gezeigt) als Schlüssel und wie man die Elemente/attribute sourceHost und destHost von "link" herstellt, um auf den vorherigen Bezug zu nehmen.

EDIT: Ich werde Ihnen nur mehr über das Modellierungsproblem erzählen, bemerkte ich meine Frage ist nicht sehr genau. Da ich eine Netzwerkinfrastruktur modelliere, ist es mir egal, dass ein Vertex (Host) nicht mit anderen Knoten (Hosts) "verbunden" ist. Ich dachte darüber nach, den Graphen nur mit Links zu modellieren, und da mir Quellknoten und Zielknoten (für meinen Anwendungsfall) egal sind, könnte ich modellieren, dass nur ein Link für jedes Paar verbundener Knoten eingefügt wird. Tatsache ist, dass ich eine XML-Anwendung (und ein XML-Schema) ausgehend von einer generischen Java-Schnittstelle modellieren und alle darauf bezogenen Informationen darstellen muss. Nehmen wir an, die Schnittstelle

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

eine Schnittstelle wie diese gegeben ist, ich choosed auch Host-Elemente in meinem Stammelement Netzwerk gehören (es kann einfacher Host-Zugriffe durch erste und zweite Methode der Schnittstelle erforderlich machen), das ist warum die obige Betrachtung über ein Nur-Links-Netzwerkelement fehlschlägt (meiner Meinung nach).

Wie Sie sehen können, benötigt die dritte Methode die Information über den Verbindungsstatus bei zwei Hosts, deshalb brauche ich auch das Link-Element in meinem XSD.

Antwort

1

Da Sie sagen, es ist die Modellierung Problem, das Sie interessiert sind, nicht die XSD Details, lassen Sie uns einige Alternativen. Ein Graph ist ein Paar (V, E), wobei V eine willkürliche Menge ist und E eine Beziehung auf V ist, dh eine Menge von Paaren (v1, v2), wobei (a) v1 und v2 beide sind in V und (b) (v2, v1) ist genau dann in E, wenn (v2, v1) in E ist. Die Glieder von V sind die Eckpunkte des Graphen und die Glieder von E sind die Kanten. Einige Definitionen von Graphen machen E zu einem Sack voller Kanten, nicht zu einer Menge, so dass zwei Ecken durch null oder mehr Bögen verbunden werden können; einige Definitionen erlauben und andere verbieten Kanten mit v1 = v2.

In XML werden drei recht offensichtliche Wege einen Graphen darzustellen:

  1. Ein Element für jeden Scheitelpunkt und ein Element für jede Kante, die das Paar von Endpunkten in beliebiger Reihenfolge geben, weder innerhalb der anderen geschlossenen . Ein Graph von drei Knoten a, b, c, mit Kanten von b zu sich selbst und von einem könnte sein sein:

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

    Einige Benutzer (und wahrscheinlich einige Werkzeugketten) werden es vorziehen, dass die Endpunkte der Kanten gegeben werden von Kindern, nicht von einem Attribut; Es ist dein Schema, du entscheidest auf der Grundlage deines eigenen Wissens, deiner Fähigkeiten und deines Geschmacks.

  2. Ein Element für jeden Knoten und untergeordnete Elemente, die angeben, an welche anderen Elemente es angrenzt. Wenn wir die Kante aufgezeichnet werden an beiden Enden erlauben und nicht notwendigerweise beide, könnten wir für die obige Grafik

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

    In Abhängigkeit von der relativen Häufigkeit von Operationen wie Update und Suche beschrieben haben, können wir es vorziehen, dass jeder verlangen Die Kante wird an beiden Enden aufgezeichnet, so dass jeder Knoten als untergeordnete Knoten eine vollständige Liste aller benachbarten Knoten enthält (auf Kosten einer komplizierteren Validierung des XML); dann könnten wir brauchen:

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

    Beachten Sie, dass der Satz von Kanten in dieser Darstellung indirekt durch die Adjazenzrelation vertreten ist. Für einige Zwecke ist das eine gute Idee; Für andere wird es wahrscheinlich eine schlechte Idee sein. Deine Entscheidung.

  3. So wie es möglich ist, Kanten im XML-Code Vertices unterzuordnen, ist es möglich, Scheitelpunkte Kanten zuzuordnen. Da der Graph nicht notwendigerweise verbunden ist, benötigen wir auch einen anderen Weg, um Vertices zu signalisieren, die nicht auf irgendeine Kante auftreffen. Unser Beispiel Graphen könnte sein:

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

    Hier ist es die Menge von Knoten, die implizit ist (es ist distinct-values(for $e in $graph/edge return tokenize(@endpoints,' '), tokenize($graph/isolated/@vertices,' '))).

Alle diese sind einfach in XSD zu definieren; Das XSD die erforderlichen referenziellen Integritätsbedingungen zu erzwingen wird wahrscheinlich in einigen Darstellungen einfacher sein als in anderen. (Insbesondere in der zweiten Variante, die erfordert, dass jede Kante an beiden Enden dargestellt wird, ist in XSD 1.0 schwierig.)

Beachten Sie, dass es in jedem Fall einen gewissen Kompromiss zwischen Direktheit des Ausdrucks und Redundanz gibt. In Methode 1 haben wir eine einfache XML-Repräsentation der Menge der Ecken und auch der Menge der Kanten. Aber die Trennung der beiden bedeutet, dass, um zu überprüfen, ob die Kanten korrekt dargestellt werden, jeder Endpunktwert in den Kanten untersucht werden muss, um sicherzustellen, dass er einen bekannten Eckpunkt benennt. Auch wenn wir nur an Vertices interessiert sind, die mit anderen Vertices verbunden sind - wenn also ein isolierter Vertex ein Codierungsfehler ist - dann müssen wir in Methode 1 auch jeden Vertex überprüfen, um sicherzustellen, dass er als Endpunkt benannt ist mindestens eine Kante. In Methode 2 ist ein Endpunkt für jede Kante garantiert korrekt, da Kanten nur als untergeordnete Knoten auftreten. Wir müssen jedoch jede Kennung für den anderen Eckpunkt an jeder Kante überprüfen. Und Methode 2 erfordert entweder redundante Informationen über jede Verbindung unter jedem Endpunkt oder es erfordert eine Suche aller Knoten im Netzwerk, um alle Kanten zu finden, die mit einer gegebenen Kante verbunden sind.

Wenn Sie nicht-triviale Informationen zu jedem Knoten und jeder Verknüpfung speichern müssen, ist Methode 1 am wenigsten redundant.

+0

Sehr genaue Antwort. Könnten Sie bitte meine Bearbeitung überprüfen? Das sind die Gründe, warum ich die zweite und die dritte Methode vermeiden würde (ich denke, es wäre ziemlich kompliziert, die Informationen zu erhalten, die ich brauche). Es gibt auch Beispiele für mein Modellierungsproblem. – Serusar

1

Sie modellieren konnte Host-Typen in einem Link-Element mit:

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

Das ist nett, ich habe darüber nachgedacht. Ich habe hier gefragt, weil ich vermeiden würde, Daten zu replizieren (in Ihrer Lösung gibt es ein wenig Redundanz). Übrigens, wenn ich das Root-Element Network verwende, schlage ich vor, Link-Elemente und Host-Elemente innerhalb von itben auf dieselbe Ebene zu setzen (wenn ich das richtig verstanden habe). – Serusar

+0

Ja, sie sind alle "First-Class-Bürger" in der Netzwerk-Domain. Anschließend verwenden Sie das XSD, um die Zuordnungen zwischen den Domänenobjekten (Host, Link usw.) zu definieren. – codebrane

Verwandte Themen