Semantic Web Technologien Lehrveranstaltung Semantic Web Technologien WS 2009/10  HTWG Konstanz
Sprachen des Semantic Web RDF(S) Frameworks
Programmierungs-Frameworks für RDF(S) <ul>Seit der Einführung des Resource Description Frameworks sind bereits einige Jahr...
Viele Programmier-Frameworks sind dabei entstanden
Framework hier: </li><ul><li>Eher Programmbibliotheken
Teilweise schon in Richtung Triple-Stores
Oft stark erweiterbare Baukästen
Meist auf Java basierend </li><ul><li>Gibt es aber auch für alle anderen Sprachen </li></ul><li>Zum größten Teil Open Sour...
Sprachen des Semantic Web Sesame
Programmierungs-Frameworks für RDF(S) <ul>Sesame <ul><li>Im Februar 2000 wurde das On-To-Knowledge Forschungs-Projekts der...
Beteiligung vieler Unternehmen und Organisationen </li></ul><li>Die Firma Aduna legt in diesem Rahmen den Grundstein von S...
Als Middleware zur Speicherung und zum Abruf von RDF(S) basierter Daten und Metadaten
Seit dem Ende von On-To-Knowledge führt Aduna Sesame als Open-Source-Projekt weiter
Basiert auf Java-Technologien
Großer Funktionsumfang
http://www.openrdf.org/ </li></ul></ul>
Programmierungs-Frameworks für RDF(S) <ul>Sesame <li>Aktuell zwei Versionsreihen (1.x und 2.x) </li><ul><li>1.x  war noch ...
2.x  (seit Ende 2007) stärker zum Einsatz als Bibliothek
Rückwärtskompatibilität musste aufgegeben werden
Sesame 2.x nutzt viele Features von Java 5 (typsichere Collections...)
Sesame 2.x führt Unterstützung für Kontext und Transaktionen ein </li></ul></ul>
Programmierungs-Frameworks für RDF(S) <ul>Sesame <li>Vollständig modularer Aufbau </li><ul><li>(Fast) Jede Komponente kann...
Modularität wird durch Vielzahl Interface-basierter APIs erreicht </li></ul></ul>
Programmierungs-Frameworks für RDF(S) <ul>Sesame <li>Wichtigstes API: SAIL </li><ul><li>Storage and Inference Layer
Diese Schicht sorgt für die persistierung der Daten und bietet Reasoning-Dienste an
Durch SAIL-API wird vollständige Abstraktion erreicht
Für obenliegende Schichten ist es (fast) vollkommen egal, auf welche Art die Daten letztendlich gespeichert werden </li></...
Programmierungs-Frameworks für RDF(S) <ul>Sesame <li>Weitere Layer </li><ul><li>Query-Layer bietet diverse Query-Engines f...
Repository API </li><ul><li>Zentraler Zugriffspunkt auf Sesame Repositories
Inhalte können abgerufen/aktualisiert werden
Sowohl Lokale als auch Remote Repositories ansprechbar </li><ul><li>API kümmert sich um Client-Server-Kommunikation </li><...
Programmierungs-Frameworks für RDF(S) <ul>Sesame <li>RDF-Model von Sesame 2.x </li></ul>
Programmierungs-Frameworks für RDF(S) <ul><li>Sesame – Arbeiten mit dem Graph API // Erstelle einen Graph Graph myGraph = ...
Programmierungs-Frameworks für RDF(S) <ul>Sesame - Weitere Eigenschaften <ul><li>Sesame liefert eine Webapplikation zur Ad...
Client kann bei Anfrage angeben, in welchem Format er die Antwort wünscht: </li><ul><li>RDF/XML, N-Triples, Turtle, N3, Tr...
Sesame als Backend für Semantic Desktop Nepomuk
Sesame-Jena-Integrations-Schicht basierend auf SAIL
Wrapper / Portierungen für PHP, Python, Perl, Ruby, C# ... ... </li></ul></ul></ul>
Sprachen des Semantic Web Mulgara Semantic Store
Programmierungs-Frameworks für RDF(S) <ul>Mulgara Semantic Store <ul><li>Fork des Kowari-Projektes
Ziel: Implementierung hochskalierbarer transaktionssicherer Triple-Store-Engine nicht basierend auf relationalen Datenbank...
Open-Source-Projekt
Sehr aktiv (Releases etwa alle 2 Monate)
Nächste SlideShare
Wird geladen in …5
×

6 - Sprachen des Semantic Web - RDF(S) Frameworks

3.239 Aufrufe

Veröffentlicht am

Vorlesung Semantic Web Technologien, HTWG Konstanz WS 2009/2010.

Veranstaltung #6

Nach den theoretischen Grundlagen vom letzten Mal, wenden wir uns nun wieder den eher praktischen Gefielden zu. In der aktuellen Vorlesung beschäftigen wir uns mit RDF(S)-Frameworks aus der Java Welt.

Zunächst wird mit Sesame eines der bekanntesten Frameworks vorgestellt. Durch sein Storage and Inference Layer (SAIL) kann es semantische Daten mit praktisch beliebigen Mechanismen persistieren.

Der Mulgara Semantic Store ist ein Triple Store, der nativ in Java als Triple Store implementiert ist und nicht auf relationale Datenbanken angewiesen ist. Als wichtigstes Feature gibt es bei Mulgara das Resolver-SPI, mit dem es möglich ist, entfernten Content zu integrieren.
Mit dem Topaz Projekt existiert eine Erweiterung zu Mulgara, die die Idee eines Objekt Relational Mappers ala Hibernate in die Semantic Web Welt transferiert.

Abschließend beschäftigen wir uns mit Jena, dem marktführenden Semantic Web Framework, dass ursprünglich von Hewlett Packard als Open Source entwickelt wurde und seit kurzem als OpenJena verfügbar ist. Viele Beispiele demonstrieren, wie man mit dem Jena API die wichtigsten Aufgaben erledigt.

Veröffentlicht in: Technologie, Bildung
0 Kommentare
3 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

Keine Downloads
Aufrufe
Aufrufe insgesamt
3.239
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
100
Aktionen
Geteilt
0
Downloads
23
Kommentare
0
Gefällt mir
3
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

6 - Sprachen des Semantic Web - RDF(S) Frameworks

  1. 1. Semantic Web Technologien Lehrveranstaltung Semantic Web Technologien WS 2009/10 HTWG Konstanz
  2. 2. Sprachen des Semantic Web RDF(S) Frameworks
  3. 3. Programmierungs-Frameworks für RDF(S) <ul>Seit der Einführung des Resource Description Frameworks sind bereits einige Jahre ins Land gegangen. <ul><li>Diverse Organisationen (Universitäten, Firmen...) haben praktische Forschung in Richtung Semantic Web betrieben
  4. 4. Viele Programmier-Frameworks sind dabei entstanden
  5. 5. Framework hier: </li><ul><li>Eher Programmbibliotheken
  6. 6. Teilweise schon in Richtung Triple-Stores
  7. 7. Oft stark erweiterbare Baukästen
  8. 8. Meist auf Java basierend </li><ul><li>Gibt es aber auch für alle anderen Sprachen </li></ul><li>Zum größten Teil Open Source Projekte </li></ul></ul></ul>
  9. 9. Sprachen des Semantic Web Sesame
  10. 10. Programmierungs-Frameworks für RDF(S) <ul>Sesame <ul><li>Im Februar 2000 wurde das On-To-Knowledge Forschungs-Projekts der EU ins Leben gerufen </li><ul><li>Ziel: Entwicklung von Tools und Methoden für das Semantic Web
  11. 11. Beteiligung vieler Unternehmen und Organisationen </li></ul><li>Die Firma Aduna legt in diesem Rahmen den Grundstein von Sesame
  12. 12. Als Middleware zur Speicherung und zum Abruf von RDF(S) basierter Daten und Metadaten
  13. 13. Seit dem Ende von On-To-Knowledge führt Aduna Sesame als Open-Source-Projekt weiter
  14. 14. Basiert auf Java-Technologien
  15. 15. Großer Funktionsumfang
  16. 16. http://www.openrdf.org/ </li></ul></ul>
  17. 17. Programmierungs-Frameworks für RDF(S) <ul>Sesame <li>Aktuell zwei Versionsreihen (1.x und 2.x) </li><ul><li>1.x war noch stark auf die Verwendung als Server ausgerichtet
  18. 18. 2.x (seit Ende 2007) stärker zum Einsatz als Bibliothek
  19. 19. Rückwärtskompatibilität musste aufgegeben werden
  20. 20. Sesame 2.x nutzt viele Features von Java 5 (typsichere Collections...)
  21. 21. Sesame 2.x führt Unterstützung für Kontext und Transaktionen ein </li></ul></ul>
  22. 22. Programmierungs-Frameworks für RDF(S) <ul>Sesame <li>Vollständig modularer Aufbau </li><ul><li>(Fast) Jede Komponente kann ausgetauscht, erweitert oder den persönlichen Vorlieben angepasst werden
  23. 23. Modularität wird durch Vielzahl Interface-basierter APIs erreicht </li></ul></ul>
  24. 24. Programmierungs-Frameworks für RDF(S) <ul>Sesame <li>Wichtigstes API: SAIL </li><ul><li>Storage and Inference Layer
  25. 25. Diese Schicht sorgt für die persistierung der Daten und bietet Reasoning-Dienste an
  26. 26. Durch SAIL-API wird vollständige Abstraktion erreicht
  27. 27. Für obenliegende Schichten ist es (fast) vollkommen egal, auf welche Art die Daten letztendlich gespeichert werden </li></ul></ul>
  28. 28. Programmierungs-Frameworks für RDF(S) <ul>Sesame <li>Weitere Layer </li><ul><li>Query-Layer bietet diverse Query-Engines für verschiedene Anfragesprachen (z.B.: SPARQL)
  29. 29. Repository API </li><ul><li>Zentraler Zugriffspunkt auf Sesame Repositories
  30. 30. Inhalte können abgerufen/aktualisiert werden
  31. 31. Sowohl Lokale als auch Remote Repositories ansprechbar </li><ul><li>API kümmert sich um Client-Server-Kommunikation </li></ul><li>In Version 2.x stark ausgebaut und um Kontextmechanismen (woher kommt dieses Triple) und Transaktionen erweitert </li></ul><li>Graph-API (RDF-Modell in Sesame 2.x) </li><ul><li>Programmatisches Arbeiten mit Triplen (siehe nächste Folien) </li></ul></ul></ul>
  32. 32. Programmierungs-Frameworks für RDF(S) <ul>Sesame <li>RDF-Model von Sesame 2.x </li></ul>
  33. 33. Programmierungs-Frameworks für RDF(S) <ul><li>Sesame – Arbeiten mit dem Graph API // Erstelle einen Graph Graph myGraph = new org.openrdf.model.impl.GraphImpl( ); // Ressourcen werden mit einer ValueFactory erstellt ValueFactory myFactory = myGraph.getValueFactory( ); String namespace = “http://www.example.com/family#”; // Erstellen wir zunächst benötigte Ressourcen URI birgit = myFactory.createURI( namespace, “Birgit” ); URI hasName = myFactory.createURI( namespace, “hasName” ); Literal name = myFactory.createLiteral( “Birgit” ); // Nun können wir dieses Triple zum Graph hinzufügen myGraph.add( birgit, hasName, name ); // Aussage können auch direkt an Ressourcen angehängt werden (1.x) URI personClass = myFactory.createURI( namespace, “Person” ); URI rdfType = myFactory.createURI( org.openrdf.vocabulary.RDF.TYPE ); birgit.addProperty( rdfType, personClass ); </li></ul>
  34. 34. Programmierungs-Frameworks für RDF(S) <ul>Sesame - Weitere Eigenschaften <ul><li>Sesame liefert eine Webapplikation zur Administration des Servers in Form einer WAR-Datei </li><ul><li>Deployment in einem Servlet-Container, wie zum Beispiel Tomcat </li></ul><li>REST-Webservice </li><ul><li>Zugriff mit HTTP GET, POST, DELETE, PUT
  35. 35. Client kann bei Anfrage angeben, in welchem Format er die Antwort wünscht: </li><ul><li>RDF/XML, N-Triples, Turtle, N3, TriX, … </li></ul><li>Antworten auf komplexe Queries können im SPARQL Query Result Format in XML oder JSON Form oder als binäre RDF-Ergebnis-Tabellen erfolgen </li></ul><li>Große Community steht hinter Sesame. </li><ul><li>Sesame als Backend für Ontologie-Editor Protégé
  36. 36. Sesame als Backend für Semantic Desktop Nepomuk
  37. 37. Sesame-Jena-Integrations-Schicht basierend auf SAIL
  38. 38. Wrapper / Portierungen für PHP, Python, Perl, Ruby, C# ... ... </li></ul></ul></ul>
  39. 39. Sprachen des Semantic Web Mulgara Semantic Store
  40. 40. Programmierungs-Frameworks für RDF(S) <ul>Mulgara Semantic Store <ul><li>Fork des Kowari-Projektes
  41. 41. Ziel: Implementierung hochskalierbarer transaktionssicherer Triple-Store-Engine nicht basierend auf relationalen Datenbanken (siehe Sesame, Jena), sondern mit eigenem rein Java-basiertem Storage-Layer
  42. 42. Open-Source-Projekt
  43. 43. Sehr aktiv (Releases etwa alle 2 Monate)
  44. 44. Basiert auf Java-Technologien
  45. 45. Großer Funktionsumfang
  46. 46. http://www.mulgara.org </li></ul></ul>
  47. 47. Programmierungs-Frameworks für RDF(S) <ul>Mulgara Semantic Store <li>Mulgara ist mehr als ein Triple-Store: </li><ul><li>Mulgara kann per RMI angesprochen werden
  48. 48. Per SAIL als Storage für Sesame verwendbar
  49. 49. Integrierter HTTP-Server </li><ul><li>SOAP Webservice
  50. 50. SPARQL-Protokoll-Endpunkt
  51. 51. Oberfläche zum einfachen Ausführen von Anfragen </li></ul><li>Parser für diverse Query-Sprachen und RDF-Serialisierungen
  52. 52. Mächtige Integrationsschnittstelle Resolver-API
  53. 53. Eigene Anfragesprache iTQL
  54. 54. Eigenes RDF-API: JRDF (stark an Sesames Graph-API angelehnt) </li></ul></ul>
  55. 55. Programmierungs-Frameworks für RDF(S) <ul>Mulgara Semantic Store <li>Mulgara Architektur: </li></ul>
  56. 56. Programmierungs-Frameworks für RDF(S) <ul><li>Mulgara – Arbeiten mit JRDF // Erstelle einen Graph (speicherbasiert) Graph myGraph = new GraphImpl( ); // Elemente werden über eine ElementFactory erstellt GraphElementFactory myFactory = myGraph.getElementFactory( ); String namespace = “http://www.example.com/family#”; // Erstellen wir zunächst benötigte Ressourcen URIReference birgit = myFactory.createResource( new URI( namespace, “Birgit” ) ); URIReference hasName = myFactory.createResource( new URI( namespace, “hasName” ); Literal name = myFactory.createLiteral( “Birgit” ); // Das fügen wir nun zu einem Triple zusammen Triple statement = myFactory.createTriple( birgit, hasName, name ); // Das Statement kann nun zum Graph hinzugefügt werden myGraph.add( statement ); </li></ul>
  57. 57. Programmierungs-Frameworks für RDF(S) <ul>Mulgara Semantic Store - Modelltypen in Mulgara <ul><li>Werden bei Erzeugung des Models übergeben
  58. 58. Standard mulgara:Model </li><ul><li>Normales Model auf eigenem (XA) Store
  59. 59. XA Store performante Implementierung basierend auf B-Bäumen
  60. 60. dreiteilig aufgebaut: </li><ul><li>Node Pool: Für jede Ressource eine eindeutige numerische ID
  61. 61. String Pool: Bildet Ids des NP auf eigentliche Daten ab
  62. 62. Statement Store: Verknüpfungen zwischen Ids des NP </li></ul></ul><li>mulgara:ViewModel </li><ul><li>Temporärer Graph der kombinierte Sicht auf mehrere Graphen gleichzeitig bietet
  63. 63. Kombination von Graphen als Vereinigung / Schnittmenge
  64. 64. Schreiben nicht möglich </li></ul><li>mulgara:Lucene </li><ul><li>Volltext-Index-Modell basierend auf Suchmaschine Lucene
  65. 65. Literale als Objekt werden direkt indiziert
  66. 66. URIs als O werden als URL behandelt und abgerufen/Inhalt indiziert
  67. 67. Anfragen hierbei mit Unschärfe möglich (Groß/Klein/Wortteile...) </li></ul></ul></ul>
  68. 68. Programmierungs-Frameworks für RDF(S) <ul>Mulgara Semantic Store - Modelltypen in Mulgara <ul><li>mulgara:XMLSchemaModel </li><ul><li>Datentyp-Graph
  69. 69. Enthalten konzeptuelle jede wahre Aussage für einen Datentyp
  70. 70. Beispielsweise 1<2, Heiligabend ist vor Sylvester …
  71. 71. Prädikate mulgara:lt, mulgara:gt, mulgara:after, mulgara:before </li></ul><li>mulgara:TypeModel </li><ul><li>Zur Typisierung von RDF-Knoten (Resource,Literal,B-Node)
  72. 72. Ermöglicht in Anfragen, das etwa nur Literale geliefert werden </li></ul><li>mulgara:FileSystemModel </li><ul><li>Informationen über das Dateisystem </li><ul><li>Lese-/Schreibberechtigungen
  73. 73. Dateigrößen
  74. 74. Besitzer
  75. 75. Funktionieren ähnlich wie mulgara:View </li></ul></ul></ul></ul>
  76. 76. Programmierungs-Frameworks für RDF(S) <ul>Mulgara Semantic Store – Resolver SPI <ul><li>Schnittstelle zur Integration externer Inhalte
  77. 77. Plugin-fähig
  78. 78. Protokollbasiert wird ein passender Resolver gewählt
  79. 79. Resolver kümmert sich um das Empfangen von Inhalten
  80. 80. Verarbeitung von Inhalten durch ContentHandler
  81. 81. ContentHandler wird anhand des Mime-Type der Daten ermittelt
  82. 82. Passender ContentHandler liefert dann die Triple </li><ul><li>Contenthandler bereits vorhanden für </li><ul><li>RDF/XML
  83. 83. Mailbox
  84. 84. MP3
  85. 85. ... </li></ul></ul></ul></ul>
  86. 86. Programmierungs-Frameworks für RDF(S) <ul>Mulgara Semantic Store – Resolver SPI </ul>
  87. 87. Programmierungs-Frameworks für RDF(S) <ul>Mulgara Semantic Store – Topaz Project <ul><li>http://www.topazproject.org
  88. 88. Java-Bibliothek zur RDF-basierten Speicherung und Arbeit mit Objekten
  89. 89. Orientiert sich sehr stark an ORM-Technologien (Object-Relational-Mapping)
  90. 90. Vorbild: Hibernate Framework
  91. 91. Idee: </li><ul><li>Persistente Daten auf dem Triple-Store sollen auf klassenbasierte Objekte abgebildet werden </li></ul><li>Objektorientierte Konzepte wie Vererbung, Komposition und Assoziation werden berücksichtigt
  92. 92. Zusätzlich: OQL Object Query Language – Anfragen basierend auf Objekten anstatt auf Triplen </li></ul></ul>
  93. 93. Programmierungs-Frameworks für RDF(S) <ul><li>Topaz – Object-Triple-Mapping Bezug zu SW-Elementen wird per Annotation hergestellt @Entity(graph=”family”, types={“ex:Person”}) public class Person { private URI id; private String name; … @Id public void setId( URI id ){ this.id = id; } public URI getId( ) { return this.id; } @Predicate(uri=”ex:hasName”) public void setName( String name ){ this.name = name; } public String getName( ){ return this.name; } ... } </li></ul>
  94. 94. Programmierungs-Frameworks für RDF(S) <ul><li>Arbeiten mit Topaz Objekten Session session = sessFactory.openSession( ); Transaction txn = session.beginTransaction( ); URI birgitUri = URI.create( family + “Birgit” ); // Objekt erstellen Person birgit = new Person( birgitUri ); birgit.setName( “Birgit” ); birgit.setWohnort( “Allensbach” ); … // Objekt in den TripleStore schreiben session.saveOrUpdate( birgit ); … // Objekt aus dem Store abrufen und auf dessen Eigenschaften zugreifen Person person2 = session.get( Person.class, familiy+”Stephan” ); System.out.println( person2.getWohnort( ) ); </li></ul>
  95. 95. Sprachen des Semantic Web Jena
  96. 96. Programmierungs-Frameworks für RDF(S) <ul>Jena (Seit Herbst 2009: OpenJena) <ul><li>Zunächst von Hewlett Packard im Rahmen des Semantic Web Research Forschungsprogramm (etwa 2000) entwickelt
  97. 97. Als Open Source Software freigegeben worden
  98. 98. Mittlerweile marktführendes Framework für die Implementierung Semantik-gestützter Applikationen
  99. 99. Riesiger Funktionsumfang
  100. 100. Einfach zu erlernendes API
  101. 101. Hervorragend dokumentiert (für ein Open Source Projekt)
  102. 102. Große Community mit Erweiterungen
  103. 103. http://www.openjena.org http://jena.sourceforge.net </li></ul></ul>
  104. 104. Programmierungs-Frameworks für RDF(S) <ul>Jena – Data Abstraction Layer <ul><li>DAL basiert auf JDBC (Java DB Connectivity)
  105. 105. Einheitlicher Zugriff auf relationale Datenbanken zur persistenten Speicherung von Triplen
  106. 106. Gleiche Verwendung von Schnittstellen bei persistentem und speicherbasiertem Modell
  107. 107. Direkt von Jena unterstützte DBMS: </li><ul><li>MySQL, HSQLDB, PostgreSQL, Oracle, MS SQL </li></ul><li>Weitere Implementierung (z.B: IBM DB2) von Drittanbietern </li></ul></ul>
  108. 108. Programmierungs-Frameworks für RDF(S) <ul>Jena – Import / Export von Graphen <ul><li>Große Menge unterstützter Formate: </li><ul><li>RDF/XML (ausführlich) und RDF/XML-ABBREV (abgekürzt)
  109. 109. N3 / N-TRIPLE / TURTLE
  110. 110. … </li></ul><li>RDF Parser ARP ist eigenständiges Modul </li><ul><li>Offene Schnittstelle
  111. 111. Keine Abhängigkeiten zum Rest von Jena
  112. 112. => auch für andere Frameworks verwendbar </li></ul></ul></ul>
  113. 113. Programmierungs-Frameworks für RDF(S) <ul>Jena – Inferenz API <ul><li>Integration einer Vielzahl von Reasonern
  114. 114. Einige Reasoner bereits in Jena vorhanden: </li><ul><li>z.B. Zur einfachen aber effizienten Schlussfolgerung über die Properties rdfs:subPropertyOf und rdfs:subClassOf
  115. 115. Aber auch andere die schon den Umgang mit einfachen OWL-Konstrukten ermöglichen </li></ul><li>Über das API wird eine mächtige Reasoning-Engine für benutzerdefinierte Regeln zur Verfügung gestellt </li></ul></ul>
  116. 116. Programmierungs-Frameworks für RDF(S) <ul>Jena – Weitere interessante Features <ul><li>Verfolgen von Änderungen mit ModelChangedListener </li><ul><li>Interface
  117. 117. Kann einfach implementiert und beim Model angemeldet werden
  118. 118. Listener-Pattern wie z.B: beim AWT / Swing
  119. 119. Methoden werden dann bei Veränderungen des Models aufgerufen </li></ul><li>SPARQL-Implementierung ARQ </li><ul><li>Unterstützt Standard-Anfragen </li><ul><li>SELECT, CONSTRUCT, DESCRIBE und ASK </li></ul><li>Erweitert SPARQL um Modifikations-Statements (SPARQL/Update): </li><ul><li>INSERT, DELETE … </li></ul></ul><li>Diverse Kommandozeilen-Tools </li><ul><li>Queries von der Kommandozeile aus
  120. 120. Schemagen: Ontology-Files -> Java-Source (Konstanteninterfaces) </li></ul><li>Und noch vieles mehr ... </li></ul></ul>
  121. 121. Programmierungs-Frameworks für RDF(S) <ul><li>Jena Beispiel – Modell erstellen und füllen // Erstellen eines leeren RDF – Modells Model model = ModelFactory.createDefaultModel( ) ; // Festlegen einiger URIs String familyUri = &quot;http://example.com/family/&quot;; String ontology = &quot;http://example.com/ontology#&quot;; // Erstellen einiger Eigenschaftstypen Property hatVorname = model. createProperty ( ontology + &quot;hasFirstName&quot; ); Property hatWohnort = model. createProperty ( ontology + &quot;livesInCity&quot; ); Property istVaterVon = model. createProperty ( ontology + &quot;isFatherOf&quot; ); Property istSchwesterVon =model. createProperty ( ontology+&quot;isSisterOf&quot; ); // Erstellen der Resource &quot;Birgit&quot; (http://example.com/family/Birgit) Resource birgit = model. getResource ( familyUri + &quot;Birgit&quot; ); birgit. addProperty ( hatVorname , &quot;Birgit&quot; ); birgit. addProperty ( hatWohnort , &quot;Allensbach&quot; ); // Erstellen der Resource &quot;Stephan&quot; (http://example.com/family/Stephan) Resource stephan = model. getResource ( familyUri + &quot;Stephan&quot; ); stephan. addProperty ( hatVorname , &quot;Stephan&quot; ); stephan. addProperty ( hatWohnort , &quot;Syrgenstein&quot; ); </li></ul>
  122. 122. Programmierungs-Frameworks für RDF(S) <ul>// Erstellen der Resource &quot;Hans&quot; (http://example.com/family/Hans) Resource hans = model. createResource ( familyUri + &quot;Hans&quot; ); hans. addProperty ( hatVorname , &quot;Hans&quot; ); hans. addProperty ( hatWohnort , &quot;Syrgenstein&quot; ); // Aussagen, dass Birgit die Schwester von Stephan ist birgit. addProperty ( istSchwesterVon, stephan ); // Aussagen, dass Hans Vater von Birgit ist hans. addProperty ( istVaterVon, birgit ); // Aussagen kann man auch direkt so erstellen: Statement statement = model. createStatement ( hans,istVaterVon,stephan ); // Man muss das Statement dann aber separat zum Model hinzufügen model. add ( statement ); // Zur Massenverarbeitung auch mit Arrays... Statement[] statements = new Statement[1]; statements[0] = statement; model.add( statements ); // … sowie mit Listen List list = new ArrayList( ); list.add( statement ); model.add( list ); </ul>
  123. 123. Programmierungs-Frameworks für RDF(S) <ul><li>Jena Beispiel – Modell untersuchen // Gib mit alle Elemente die Vater von jemandem sind // da Subjekte immer Ressourcen sind, bekommen wir einen ResIterator ResIterator parents = model.listSubjectsWithProperty( istVaterVon ); while (parents.hasNext()) { Resource person = parents.nextResource(); // Gib die URI der Ressource aus System.out.println(person.getURI()); } // Gib mir alle Elemente, von denen jemand Vater ist // Da Objekte Literale oder Ressourcen sein können, bekommen wir einen // Node Iterator zurück NodeIterator children = model.listObjectsOfProperty( istVaterVon ); // Gib mir alle Elemente von denen Birgit Schwester ist NodeIterator siblings = model.listObjectsOfProperty( birgit, istSchwesterVon ); // Oder frag Birgit selbst (In dem Fall bekommen wir einen StmtIterator) StmtIterator moreSiblings = birgit.listProperties( istSchwesterVon ); </li></ul>
  124. 124. Programmierungs-Frameworks für RDF(S) <ul><li>Jena Beispiel – Modell untersuchen 2 // Finden eines bestimmten Statements (Ist eine Aussage vorhanden) model.listStatements( birgit, istSchwesterVon, stephan ); // Gib mir alle Statements mit birgit als Subjekt, Stephan als Objekt model.listStatements( birgit, null, stephan ); // Gib mir alle Statements über Stephan model.listStatements( birgit, null, stephan ); // Gib mir alle Statements mit der istVaterVon Eigenschaft model.listStatements( null, istVaterVon, null ); </li></ul>
  125. 125. Programmierungs-Frameworks für RDF(S) <ul><li>Jena Beispiel – Modelle persistieren mit Model.write() // Einfache Ausgabe des Models nach System.out in RDF/XML-Form model.write( System.out ); // Anstelle von System.out können auch andere Output-Streams stehen File file = new File( filename ); FileOutputStream fos = new FileOutputStream( file ); model.write( fos ); // Ausgabe mit abgekürzter RDF/XML Syntax model.write( fos, “RDF/XML-ABBREV” ); // Ausgabe im N-Triple-Format mit Basis-URL für relative URIs model.write( fos, “N-TRIPLE”, “http://www.example.org/” ); // Vordefinierte Formate: RDF/XML, RDF/XML-ABBREV, N-TRIPLE, TURTLE, N3 </li></ul>
  126. 126. Programmierungs-Frameworks für RDF(S) <ul><li>Jena Beispiel – Modelle lesen mit Model.read( ) // Zunächst müssen wir ein Model erstellen Model model = ModelFactory.createDefaultModel( ); // FileManager verwenden um eine Eingabedatei zu finden InputStream is = FileManager.get().open( inputFileName ); // es sollte überprüft werden ob is != null ist // Nun können wir problemlos lesen (ohne Behandlung relativer URIs) model.read( is, null ); // Optional kann wieder ein RDF-Format angegeben werden model.read( is, null, “N3” ); // Vordefinierte Formate: RDF/XML, RDF/XML-ABBREV, N-TRIPLE, TURTLE, N3 // RDF/XML-ABBREV ist hier gleichbedeutend mit RDF/XML // null bedeuted wieder RDF/XML </li></ul>
  127. 127. Programmierungs-Frameworks für RDF(S) <ul><li>Jena Beispiel – Modelle verschmelzen // Zunächst erstellen wir uns 3 Modelle Model model1 = ModelFactory.createDefaultModel( ); Model model2 = ModelFactory.createDefaultModel( ); Model model3 = ModelFactory.createDefaultModel( ); // Lesen wir die Informationen aus 2 Dateien model1.read( new InputStreamReader( fileName1 ), “” ); model2.read( new InputStreamReader( fileName2 ), “” ); // Nun können wir die zwei Modelle einfach vereinen model3 = model1.union( model2 ); // Und das verschmolzene Modell wieder ausgeben model.write( System.out, “RDF/XML-ABBREV” ); </li></ul>
  128. 128. Programmierungs-Frameworks für RDF(S) <ul><li>Jena Beispiel – Arbeiten mit RDF-Containern // Erstellung eines Bag Bag steiners = model.createBag( ); // Iterator für hatWohnort-Statements, bei denen Ort mit “stein” endet StmtIterator iter = model.listStatements( new SimpleSelector( null, hatWohnort, (RDFNode) null ){ public boolean selects( Statement s ) { return s.getObject().toString().endsWith( “stein” ); } } ); // holen wir uns alle Subjekte des Iterators und fügen sie der Bag hinzu while( iter.hasNext( ) ){ steiners.add( iter.nextStatement( ).getSubject( ) ); } // Die Ausgabe sieht in etwa folgendermaßen aus: // … // <rdf:Description rdf:nodeID=”A3”> // <rdf:type rdf:resource=” http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ” /> // <rdf:_1 rdf:resource=” http://www.example.com/family/Stephan ” /> // <rdf:_2 rdf:resource=”http://www.example.com/family/Hans” /> // … // </rdf:Description> </li></ul>
  129. 129. Programmierungs-Frameworks für RDF(S) <ul><li>Jena Beispiel – Arbeiten mit Persistenz // DB Parameter einstellen String M_DB_URL = “jdbc:mysql://localhost/jenatest”; String M_DB_USER = “testuser”; String M_DB_PASS = “testpass”; String M_DB = “MySQL”; String M_DBDRIVER_CLASS = “com.mysql.jdbc.Driver”; // DB Treiber Klasse laden Class.forName( M_DBDRIVER_CLASS ); // Connection zur Datenbank erstellen IDBConnection connection = new DBConnection( M_DB_URL, M_DB_USER, M_DB_PASS, M_DB ); // ModelMaker für die Connection erstellen ModelMaker maker = ModelFactory.createModelRDBMaker( connection ); // Standard Model erstellen ... Model defModel = maker.createDefaultModel(); // ... oder existierendes Modell öffnen Model existingModel = maker.openModel(); // alles weitere wie bisher – Jena kümmert sich um die Persistenz </li></ul>
  130. 130. Programmierungs-Frameworks für RDF(S) <ul><li>Jena Beispiel – Arbeiten mit Persistenz
  131. 131. Benannte Modelle: // benanntes Modell erstellen Model namedModel = maker.createModel( “MyNamedModel” ); // existierendes benanntes Modell öffnen Model previousNamedModel = maker.openModel( “MyStoredNamedModel” ); // Prüfen ob Model auf Datenbank existiert ModelRDB model; if( !connection.containsModel( modelName ) ) model = ModelRDB.createModel( connection, modelName ); else model = ModelRDB.open( connection, modelName ); </li></ul>
  132. 132. Programmierungs-Frameworks für RDF(S) <ul>Jena - Ist auf den Rechnern im Pool F033 installiert <ul><li>Zum Programmieren müssen einfach die nötigen JAR-Files aus dem lib Unterverzeichnis von Jena eingebunden werden: </li><ul><li>jena.jar
  133. 133. log4j-*.jar
  134. 134. slf4j-*.jar
  135. 135. slf4j-log4j*-*.jar
  136. 136. xercesImpl.jar </li></ul><li>Unter Eclipse: </li><ul><li>Project Properties
  137. 137. Java Build-Path
  138. 138. Libraries
  139. 139. Add External JARs </li></ul><li>Happy Hacking ! </li></ul></ul>
  140. 140. Programmierungs-Frameworks für RDF(S) Noch Fragen ?
  141. 141. Programmierungs-Frameworks für RDF(S) <ul><li>Literatur: </li><ul><li>Buch “Semantic Web Grundlagen”, Springer Verlag 2008 Pascal Hitzler, Markus Krötzsch, Sebastian Rudolph, York Sure ISBN: 978-3-540-33993-9
  142. 142. Sesame Dokumentation http://www.openrdf.org/documentation.jsp
  143. 143. Mulgara Tutorial / Dokumentation http://docs.mulgara.org/ http://www.mulgara.org/trac/wiki
  144. 144. Jena RDF-API Tutorial http://openjena.org/tutorial/RDF_API/index.html
  145. 145. Umfangreiches Tutorial von IBM zu Jena: http://www.ibm.com/developerworks/xml/library/j-jena/
  146. 146. JENA API-Docs http://jena.sourceforge.net/javadoc/index.html </li></ul></ul>

×