Die Definition des Dateiformates für Gravel über XMLSchema bietet den Vorteil der Validierung. Hier soll die Definition eines Elementes anhand zweier Beispiele erläutert werden. Anschließend folgt eine Übersicht der Datenelemente, die in der Erweiterung von GraphML zur Verwendung in Gravel definiert sind.
Um Attribute für die einzelnen Elemente der Datei, also Graph, (Hyper)Kante und Knoten, verwenden zu können, müssen sie zunächst definiert werden. GraphML stellt dazu bereits die einfachen Datentypen int, boolean, string
bereit. So wird etwa der Name eines Knotens als Attribut definiert, indem innerhalb des Wurzelelements
ein Datenschlüssel spezifiziert wird:
<graphml> [...] <!-- vorherige key-Spezifikationen --> <key id='nodename' for='node' attr.name='node.name' attr.type='string'> <default>v_{$ID}</default> </key> [...]<!-- nachfolgende keys und der Graph --> </graphml>
Dabei gibt nodename
eindeutig einen Referenznamen an, der Datenschlüssel ist nur für Knoten (for='node'
) definiert und ein string
. Zusätzlich wird ein Standardwert innerhalb von
angegeben.
Der Graph folgt in der Datei nach den Schlüsselangaben innerhalb des
-Elementes. Dort werden Knotennamen wie folgt angegeben:
<node id='1'></node> <node id='2'> <data key='nodename'>u</data> </node>
Das Attribut 'nodename'
verweist auf die ID der Schlüsseldefinition. Dadurch ist die Angabe in Zeile 4 als Name des Knotens 2 festgelegt. Da der erste Knoten keinen expliziten Namen erhält, wird ihm v_{$ID}
zugewiesen, wobei innerhalb von Gravel $ID
ersetzt wird durch dessen Index. Der Name von Knoten 1 lautet dann v_{1}
.
Für komplexere Datentypen werden in der Erweiterung des GraphML"=XMLSchemas für Gravel (verfügbar unter http://gravel.darkmoonwolf.de/xmlns/gravelml.xsd) spezielle komplexe Typen definiert, die als Datenschlüssel verwendet werden dürfen. Für die Darstellung eines Knotens etwa
<xs:simpleType name='node.form.type.type'> <xs:restriction base='xs:string'> <xs:enumeration value='Circle'/> </xs:restriction> </xs:simpleType> <xs:complexType name='node.form.type'> <xs:attribute name='type' type='node.form.type.type' use='required'/> <xs:attribute name='x' type='xs:integer' use='required'/> <xs:attribute name='y' type='xs:integer' use='required'/> <xs:attribute name='size' type='xs:nonNegativeInteger'/> </xs:complexType>
Der Typ der Knotenform node.form.type.type
(Zeile 1 bis 5) ist bisher lediglich ein Kreis, daher wird auf Basis des Strings (Zeile 2) der Typ als Aufzählung von nur einer Möglichkeit definiert.
Der komplexe Typ der Gesamten Knotenform
node.form.typewird nun durch 4 Attribute definiert (Zeile 6 bis 11)
type
der eben erwähnte Formtyp, bei Gravel ausschließlich der Kreis. Die Angabe des Typs ist stets Pflicht (use='required'
)x
als ganze Zahl für die horizontale Position, ebenso Pflichty
als vertikale Position analog zu x
size
ist die Größe des Knotens, hier der Durchmesser des KreisesZur Verwendung im Dokument muss nun ein weiterer Schlüssel im XML-Dokument angegeben werden, die derjenigen aus des einfachen Datentyps ähnelt:
<key id='nodeform' for='node' attr.name='node.form' attr.complexType='node.form.type'> <default> <form type='Circle' x='0' y='0' size='9'/> </default> </key>anstelle des
attr.type
wird nun mit attr.complexType
der eben erwähnte Knotenformtyp angegeben. Die Angabe des Standards legt eine Knotengröße von 9 fest, die Position ist der Knotenform Pflicht, wird aber in Gravel bezüglich des Standards ignoriert.
Im Graphen lassen sich dann Knoten wie folgt positionieren:
<node id='2'> <data key='nodename'>u</data> <data key='nodeform'> <form type='Circle' x='274' y='110'/> </data> </node> <node id='3'> <data key='nodeform'> <form type='Circle' x='23' y='42' size='12'/> </data> </node>
Der Knoten 2 hat keine Größenangabe, er erhält die Größe 9, der Knoten 3 hingegen Ihm wird die Größe 9 zugeordnet, da diese nicht explizit angegeben ist. Der Knoten 3 erhält die Größe 12.
Eine Auflistung aller Datenfelder mit ihren Attributen findet sich in der entsprechenden Übersicht.