450 likes | 546 Views
GXL – Eine XML-Anwendung. Martin Sievers 27.06.2002. Inhalt. Begriffe & Notationen Motivation & Entwicklung von GXL Austausch von Graphen mit GXL GXL in der Praxis; Implementierungen Fazit Ausblick. 1. Begriffe & Notationen. Definition Digraph.
E N D
GXL – Eine XML-Anwendung Martin Sievers 27.06.2002
Inhalt • Begriffe & Notationen • Motivation & Entwicklung von GXL • Austausch von Graphen mit GXL • GXL in der Praxis; Implementierungen • Fazit • Ausblick
Definition Digraph Seien V,E Mengen mit V nichtleer, endlich, E⊂ VxV. Dann heißt G:=(V,E) gerichteter Graph (Digraph) mit der Knotenmenge V und der Kantenmenge E.
Eigenschaften von Graphen Ein Graph G=(V,E) heißt • ungerichtet (undirected), falls E aus zweielementigen Teilmengen von V besteht • geordnet (ordered), falls auf V,E und der Menge der zu einem Knoten inzidenten Kanten eine totale Ordnung definiert ist • typisiert (typed), falls V und E aus Objekten eines bestimmten Typs bestehen • attribuiert (attributed), falls mindestens einem Graphobjekt ein Paar aus Attributbezeichnung und -wert zugeordnet ist
Definition Hypergraph Seien I Indexmenge, V Knotenmenge und ℰ :={Ei : i ∈ I} Familie von Teilmengen (sog. Hyperkanten) von V. Dann heißt H:=(V,ℰ) Hypergraph, falls • ∀ i ∈ I : Ei nicht leer • ∪ i ∈ I : Ei = V
Eigenschaften von Hypergraphen Zwei Knoten u,v heißen adjazent, falls ∃ j ∈ I : {u,v} ⊂ Ej Zwei Kanten E1,E2 heißen adjazent, falls E1∩ E2 nichtleer Die Zahl r := r(V) := max {|V ∩ Ei| : i ∈ I } heißt Rang von H und gibt an, wieviele Knoten eine Kante in H maximal verbindet. Wir nennen H auch Hypergraph r-ten Grades
Bemerkungen zu Hypergraphen • Jeder Graph ist ein Hypergraph zweiten Grades • Falls die Ei disjunkt sind, heißt H einfach (simple) • Hyperkanten werden durch Ellipsen, die die zugehörigen Kanten umschließen, dargestellt
Beispiel (Hypergraph) E4 E1 1 E5 2 4 3 5 7 6 E2 E6 8 E3
Motivation von GXL • Vielseitigkeit von Graphen führte zu verschiedenen Graph-Formaten in der Praxis ⇒Probleme beim Zusammenspiel von Softwarekomponenten • Austausch schwierig, Nutzung von Konvertern nötig ⇒Notwendigkeit eines universellen Graph-Formats
Fakten • Graph eXchange Language • XML - Untersprache • 1998 unter Leitung von Andreas Winter an der Uni Koblenz entwickelt • Aktuelle Version: GXL 1.0 (Januar 2001) • Informationen unter http://www.gupro.de/GXL/
Entwicklung von GXL (Schematisch) WCRE 1999 AlGra 2000 GROOM 2000 TA GraX PROGRES da Vinci GML Graphlet GML XGMML RPA RSF ATerms WoSEF 2000 GXL 0.4.2 Barcelona Berlin Budapest Kent GXL 0.6.6 Graph Drawing workshop on data exchange formats (GD 2000) GraphXML GXL 0.7 CASCON 2000 WCRE 2000 GXL 0.7.2 Dagstuhl 2001 „Interoperability of Reengineering Tools“ GXL 1.0 Quelle: [1], Abb. 1
Austausch von Graphen • Betrachtung typisierter, attribuierter, gerichteter, geordneter Graphen (sog. TGraphs) • Zur Verarbeitung von Hyper- bzw. hierarchischer Graphen Erweiterungen um Hyperkanten sowie hierarchische Strukturen nötig
Grundlagen für den Austausch von Graphen per GXL • GXL-Dokumente werden stets von <gxl> umschlossen; jeder im Dokument definierte Graph von <graph> • jedem Graph muß eindeutiger Name zugewiesen werden • zu jedem Graph gehört Graph-Schema • Knoten und Kanten werden mit <node> bzw. <edge> und optionalem eindeutigen Namen gekennzeichnet
Innerhalb von <node> bzw. <edge> werden durch • from und to zu einer Kante inzidente Knoten • fromorder und toorder die Ordnung der Kanten • <type> der aus dem Graph-Schema bekannte Typ für Knoten und Kanten • <attr> zugehörige evtl. verschachtelte Attribute des Typs <int>, <bool>, <string>, <float> u.a. angegeben.
GXL-Darstellung <?xml version="1.0"?><!DOCTYPE gxl SYSTEM "../../../gxl-1.0.dtd"><gxl xmlns:xlink="http://www.w3.org/1999/xlink"> <graph id="simpleExample"><type xlink:href="../../schema/gxl/simpleExampleSchema.gxl# simpleExampleSchema"/> <node id="p"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Proc"/> <attr name="file"> <string>main.c</string> </attr> </node> <node id="q"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Proc"/> <attr name="file"> <string>test.c</string> </attr> </node> <node id="v"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Var"/> <attr name="line"> <int>225</int> </attr> </node> <node id="w"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Var"/> <attr name="line"> <int>316</int> </attr> </node> <edge id="r1" from="p" to="v"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#ref"/> <attr name="line"> <int>127</int> </attr> </edge> <edge id="r2" from="q" to="w"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#ref"/> <attr name="line"> <int>27</int> </attr> </edge> <edge id="c" from="p" to="q"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#call"/> <attr name="line"> <int>42</int> </attr> </edge> </graph></gxl>
GXL-Darstellung <?xml version="1.0"?><!DOCTYPE gxl SYSTEM "../../../gxl-1.0.dtd"><gxl xmlns:xlink="http://www.w3.org/1999/xlink"> <graph id="simpleExample"><type xlink:href="../../schema/gxl/simpleExampleSchema.gxl# simpleExampleSchema"/> <node id="p"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Proc"/> <attr name="file"> <string>main.c</string> </attr> </node> <node id="q"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Proc"/> <attr name="file"> <string>test.c</string> </attr> </node> <node id="v"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Var"/> <attr name="line"> <int>225</int> </attr> </node> <node id="w"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Var"/> <attr name="line"> <int>316</int> </attr> </node> <edge id="r1" from="p" to="v"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#ref"/> <attr name="line"> <int>127</int> </attr> </edge> <edge id="r2" from="q" to="w"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#ref"/> <attr name="line"> <int>27</int> </attr> </edge> <edge id="c" from="p" to="q"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#call"/> <attr name="line"> <int>42</int> </attr> </edge></graph></gxl>
GXL-Darstellung <?xml version="1.0"?><!DOCTYPE gxl SYSTEM "../../../gxl-1.0.dtd"><gxl xmlns:xlink="http://www.w3.org/1999/xlink"> <graph id="simpleExample"><type xlink:href="../../schema/gxl/simpleExampleSchema.gxl# simpleExampleSchema"/><node id="p"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Proc"/> <attr name="file"> <string>main.c</string> </attr> </node> <node id="q"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Proc"/> <attr name="file"> <string>test.c</string> </attr> </node> <node id="v"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Var"/> <attr name="line"> <int>225</int> </attr> </node> <node id="w"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Var"/> <attr name="line"> <int>316</int> </attr> </node> <edge id="r1" from="p" to="v"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#ref"/> <attr name="line"> <int>127</int> </attr> </edge> <edge id="r2" from="q" to="w"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#ref"/> <attr name="line"> <int>27</int> </attr> </edge> <edge id="c" from="p" to="q"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#call"/> <attr name="line"> <int>42</int> </attr> </edge> </graph></gxl>
GXL-Darstellung <?xml version="1.0"?><!DOCTYPE gxl SYSTEM "../../../gxl-1.0.dtd"><gxl xmlns:xlink="http://www.w3.org/1999/xlink"> <graph id="simpleExample"><type xlink:href="../../schema/gxl/simpleExampleSchema.gxl# simpleExampleSchema"/> <node id="p"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Proc"/> <attr name="file"> <string>main.c</string> </attr> </node> <node id="q"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Proc"/> <attr name="file"> <string>test.c</string> </attr> </node> <node id="v"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Var"/> <attr name="line"> <int>225</int> </attr> </node> <node id="w"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#Var"/> <attr name="line"> <int>316</int> </attr> </node><edge id="r1" from="p" to="v"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#ref"/> <attr name="line"> <int>127</int> </attr> </edge> <edge id="r2" from="q" to="w"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#ref"/> <attr name="line"> <int>27</int> </attr> </edge> <edge id="c" from="p" to="q"> <type xlink:href="../../schema/gxl/simpleExampleSchema.gxl#call"/> <attr name="line"> <int>42</int> </attr> </edge> </graph></gxl>
Austausch von Hypergraphen per GXL • Betrachtung typisierter, attribuierter, (un-)gerichteter, geordneter Hypergraphen ⇒Notwendigkeit zusätzlicher Tags im GXL-Dokument • jede Hyperkante wird durch <rel> definiert und evtl. durch <type> und <attr> näher erklärt • die durch eine Hyperkante verbundenen Knoten werden über <relend> angegeben und durch target, role, startorder, endorder, isdirected, direction genauer spezifiziert.
Beispiel (Hypergraph) a = max(a,b)
<?xml version="1.0"?><!DOCTYPE gxl SYSTEM "../../../gxl-1.0.dtd"><gxl xmlns:xlink="http://www.w3.org/1999/xlink"> <graph id="hypergraph2"><type xlink:href="../../schema/gxl/hypergraph2Schema.gxl# hypergraph2Schema"/> <node id="v1"> <type xlink:href="../../schema/gxl/hypergraph2Schema.gxl#Function"/> <attr name="name"> <string>main</string> </attr> </node> <node id="v4"> <type xlink:href="../../schema/gxl/hypergraph2Schema.gxl#Function"/> <attr name="name"> <string>max</string> </attr> </node> <node id="v6"> <type xlink:href="../../schema/gxl/hypergraph2Schema.gxl#Variable"/> <attr name="name"> <string>a</string> </attr> </node> <node id="v7"> <type xlink:href="../../schema/gxl/hypergraph2Schema.gxl# Variable"/> <attr name="name"> <string>b</string> </attr> </node><rel id="r1"> <type xlink:href="../../schema/gxl/hypergraph2Schema.gxl# FunctionCall2"/> <attr name="line"> <int>8</int> </attr> <relend target="v1" role="caller"/> <relend target="v4" role="callee"/> <relend target="v6" role="output"/> <relend target="v6" role="input" startorder="1"/> <relend target="v7" role="input" startorder="2"/></rel> </graph></gxl>
<?xml version="1.0"?><!DOCTYPE gxl SYSTEM "../../../gxl-1.0.dtd"><gxl xmlns:xlink="http://www.w3.org/1999/xlink"> <graph id="hypergraph2"><type xlink:href="../../schema/gxl/hypergraph2Schema.gxl# hypergraph2Schema"/> <node id="v1"> <type xlink:href="../../schema/gxl/hypergraph2Schema.gxl#Function"/> <attr name="name"> <string>main</string> </attr> </node> <node id="v4"> <type xlink:href="../../schema/gxl/hypergraph2Schema.gxl#Function"/> <attr name="name"> <string>max</string> </attr> </node> <node id="v6"> <type xlink:href="../../schema/gxl/hypergraph2Schema.gxl#Variable"/> <attr name="name"> <string>a</string> </attr> </node> <node id="v7"> <type xlink:href="../../schema/gxl/hypergraph2Schema.gxl# Variable"/> <attr name="name"> <string>b</string> </attr> </node><rel id="r1"> <type xlink:href="../../schema/gxl/hypergraph2Schema.gxl# FunctionCall2"/> <attr name="line"> <int>8</int> </attr> <relend target="v1" role="caller"/> <relend target="v4" role="callee"/> <relend target="v6" role="output"/> <relend target="v6" role="input" startorder="1"/> <relend target="v7" role="input" startorder="2"/> </rel> </graph></gxl>
Austausch hierarchischer Graphen Problem: Große Graphen führen schnell zu unübersichtlichen Strukturen Lösung: Zusammenfassung zusammengehöriger Objekte zu eigenständigen Strukturen Umsetzung in GXL durch Verschachtelung von <graph>-Elementen
<edge id="e1" from="u" to="v"> <type xlink:href="../../schema/gxl/ crossingSchema.gxl#E"/> </edge></graph> </node> <node id="w"> <type xlink:href="../../schema/gxl/ crossingSchema.gxl#W"/> </node> <edge id="e2" from="t" to="w"> <type xlink:href="../../schema/gxl/ crossingSchema.gxl#f"/> </edge> <edge id="e3" from="w" to="v"> <type xlink:href="../../schema/ gxl/crossingSchema.gxl#g"/> </edge></graph></gxl> <?xml version="1.0"?><!DOCTYPE gxl SYSTEM "../../../gxl-1.0.dtd"><gxl xmlns:xlink= "http://www.w3.org/1999/xlink"><graph id="crossingHierarchies"><type xlink:href="../../schema/gxl/ crossingSchema.gxl#crossingSchema"/> <node id="t"> <type xlink:href="../../schema/gxl/ crossingSchema.gxl#T"/><graph id="graph2"><type xlink:href="../../schema/gxl/ crossingSchema.gxl#GraphT"/> <node id="u"> <type xlink:href="../../ schema/gxl/ crossingSchema.gxl#U"/> </node> <node id="v"> <type xlink:href= "../../schema/ gxl/crossingSchema.gxl#V"/> </node>
<edge id="e1" from="u" to="v"> <type xlink:href="../../ schema/gxl/ crossingSchema.gxl#E"/> </edge></graph> </node> <node id="w"> <type xlink:href="../../schema/gxl/ crossingSchema.gxl#W"/> </node> <edge id="e2" from="t" to="w"> <type xlink:href="../../schema/gxl/ crossingSchema.gxl#f"/> </edge> <edge id="e3" from="w" to="v"> <type xlink:href="../../schema/ gxl/crossingSchema.gxl#g"/> </edge></graph></gxl> <?xml version="1.0"?><!DOCTYPE gxl SYSTEM "../../../gxl-1.0.dtd"><gxl xmlns:xlink= "http://www.w3.org/1999/xlink"><graph id="crossingHierarchies"><type xlink:href="../../schema/gxl/ crossingSchema.gxl#crossingSchema"/> <node id="t"> <type xlink:href="../../schema/gxl/ crossingSchema.gxl#T"/><graph id="graph2"><type xlink:href="../../schema/gxl/ crossingSchema.gxl#GraphT"/> <node id="u"> <type xlink:href="../../ schema/gxl/ crossingSchema.gxl#U"/> </node> <node id="v"> <type xlink:href= "../../schema/ gxl/crossingSchema.gxl#V"/> </node>
Weitere Aspekte • Graphmodell von GXL als XML-DTD • Übersetzung manuell durchgeführt ⇒nur 18 XML Elemente notwendig
Graph-Schemata • Graphen stellen Strukturen zur Beschreibung von Objekten (Knoten) und Zusammenhänge (Hyperkanten) bereit • Graphen haben keine eigene Bedeutung ⇒Interpretation eines Graphen durch Betrachtung der dahinterliegenden Anwendung
Anwendung entscheidet über • Knoten, Kanten, Hyperkanten • Beziehungen zwischen Graphobjekten • Attributstrukturen • Graphhierachien • weitere Bedingungen wie Inzidenzordnung, Gradbeschränkung etc.
Darstellung von Graph-Schemata • Schematische Daten werden durch UML-Klassen-Diagramme dargestellt • UML-Klassen-Diagramme können ebenfalls als Graphen dargestellt werden ⇒Konkrete Graphen und Schemata können im selben Dokument beschrieben werden (dies entspricht nicht dem XMI-Ansatz)
Überblick Graph-Klasse Zur Darstellung von Schema-Graphen ist Instanz von UML-Klassen-Diagramm UML-Objekt-Diagramm ist Instanz von dargestellt als visualisiert als GXL-Metaschema repräsentiert als GXL Graph GXL-Schema nutzt definiert wird repräsentiert durch Nach: [7], Seite 2.
GXL in der Praxis GXL bzw. seine direkten Vorgänger wurden schon zur Analyse einiger „prominenter“ Anwendungen benutzt • GCC C++ Compiler (1.000.000 LOC) • Linux Kernel (7.000.000 LOC) • Netscape Navigator
Implementierungen • Implementierungen zwar angekündigt, jedoch bisher nicht ausreichend umgesetzt • Einzelne (studentische) Projekte • Stillstand?
Fazit GXL • ist akzeptiertes Graph-Austauschformat • bietet flexibles, erweiterbares Graphformat • ist einfach zu benutzen; intuitiv • wird durch Forschung und Wirtschaft unterstützt • ist (noch) nicht ausreichend implementiert
Ausblick • GXL wird (hoffentlich) immer stärker auch bei bestehenden Softwarepaketen berücksichtigt • GXL ist Grundlage für weitere Graph-Austauschformate • GXL wird das Zusammenwirken einzelner Softwarekomponenten stark vereinfachen
Literatur / Quellen [1] C.Berge: Graphs and Hypergraphs. North-Holland, Amsterdam, 2.Edition, 1976. [2] J.Ebert, A.Franzke. A Declarative Approach to Graph Based Modelling. In: E.Mayr et al. (Hrsg.). Graphtheoretic Concepts in Computer Science, LNCS 903. Springer, Berlin, S. 38 - 50. 1995. [3] J.Ebert, K.Kontogiannis, J.Mylopoulos: Interoperbility of Reengineering Tools. http://www.dagstuhl.de/DATA/Reports/ 01041/, 2001.
Literatur / Quellen [4] A.Winter: Exchanging Graphs with GXL. http://www.gupro.de/GXL, 2001. [5] http://www.gupro.de/GXL/(graph model). [6] http://www.gupro.de/GXL/(DTD). [7] http://ist.unibw-muenchen.de/GXL/volk/ gxl.the_basics/gxl_the_basics.htm.