Announcement

Collapse
No announcement yet.

Formulierung von SPARQL-Anfragen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Formulierung von SPARQL-Anfragen

    Hallo,

    ich arbeite mich gerade in das Thema "Semantic Web" ein und habe einige Schwierigkeiten mit der Formulierung korrekter SPARQL-Anfragen.
    Ich habe folgende Beispiel-Ontologie gebaut:
    Code:
    <?xml version="1.0"?>
    
    <!DOCTYPE rdf:RDF [
        <!ENTITY author "http://bibliothek.de/Autoren/">
        <!ENTITY book "http://bibliothek.de/Buecher/">
        <!ENTITY rel "http://bibliothek.de/Beziehungen/">
        <!ENTITY owl "http://www.w3.org/2002/07/owl#">
        <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">
        <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#">
        <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">
    ]>
    
    <rdf:RDF xmlns="http://bibliothek.de/Beispiel.owl#"
             xml:base="http://bibliothek.de/Beispiel.owl"
             xmlns:author="&author;"
             xmlns:book="&book;"
             xmlns:rel="&rel;"
             xmlns:owl="&owl;"
             xmlns:rdf="&rdf;"
             xmlns:rdfs="&rdfs;"
             xmlns:xsd="&xsd;">
    
        <owl:Ontology rdf:about=""/>
    
        <owl:Class rdf:about="&author;Gender"/>
    
        <owl:Class rdf:about="&author;Person"/>
    
        <owl:Class rdf:about="&author;Man">
            <rdfs:subClassOf rdf:resource="&author;Person"/>
            <owl:equivalentClass>
                <owl:Restriction>
                    <owl:onProperty rdf:resource="&rel;gender"/>
                    <owl:hasValue rdf:resource="&author;male"/>
                </owl:Restriction>
            </owl:equivalentClass>
        </owl:Class>
    
        <owl:Class rdf:about="&author;Woman">
            <rdfs:subClassOf rdf:resource="&author;Person"/>
            <owl:equivalentClass>
                <owl:Restriction>
                    <owl:onProperty rdf:resource="&rel;gender"/>
                    <owl:hasValue rdf:resource="&author;female"/>
                </owl:Restriction>
            </owl:equivalentClass>
        </owl:Class>
    
        <owl:Class rdf:about="&book;Book"/>
    
        <owl:DatatypeProperty rdf:about="&author;firstname">
            <rdf:type rdf:resource="&owl;FunctionalProperty"/>
            <rdfs:domain rdf:resource="&author;Person"/>
            <rdfs:range rdf:resource="&xsd;string"/>
        </owl:DatatypeProperty>
    
        <owl:DatatypeProperty rdf:about="&author;lastname">
            <rdf:type rdf:resource="&owl;FunctionalProperty"/>
            <rdfs:domain rdf:resource="&author;Person"/>
            <rdfs:range rdf:resource="&xsd;string"/>
        </owl:DatatypeProperty>
    
        <owl:ObjectProperty rdf:about="&rel;gender">
            <rdf:type rdf:resource="&owl;FunctionalProperty"/>
            <rdfs:domain rdf:resource="&author;Person"/>
            <rdfs:range rdf:resource="&author;Gender"/>
        </owl:ObjectProperty>
    
        <owl:DatatypeProperty rdf:about="&book;title">
            <rdf:type rdf:resource="&owl;FunctionalProperty"/>
            <rdfs:domain rdf:resource="&book;Book"/>
            <rdfs:range rdf:resource="&xsd;string"/>
        </owl:DatatypeProperty>
    
        <owl:DatatypeProperty rdf:about="&book;genre">
            <rdf:type rdf:resource="&owl;FunctionalProperty"/>
            <rdfs:domain rdf:resource="&book;Book"/>
            <rdfs:range rdf:resource="&xsd;string"/>
        </owl:DatatypeProperty>
    
        <owl:ObjectProperty rdf:about="&rel;isAuthorOf">
            <rdf:type rdf:resource="&owl;FunctionalProperty"/>
            <rdfs:domain rdf:resource="&author;Person"/>
            <rdfs:range rdf:resource="&book;Book"/>
        </owl:ObjectProperty>
    
        <owl:ObjectProperty rdf:about="&rel;wasWrittenBy">
            <owl:inverseOf rdf:resource="&rel;isAuthorOf"/>
        </owl:ObjectProperty>
    
        <author:Person rdf:about="&author;MCrichton">
            <author:firstname>Michael</author:firstname>
            <author:lastname>Crichton</author:lastname>
            <rel:gender rdf:resource="&author;male"/>
            <rel:isAuthorOf rdf:resource="&book;Jurassic_Park"/>
        </author:Person>
    
        <author:Man rdf:about="&author;RLStevenson">
            <author:firstname>Robert Louis</author:firstname>
            <author:lastname>Stevenson</author:lastname>
        </author:Man>
    
        <author:Woman rdf:about="&author;JKRowling">
            <author:firstname>Joanne K.</author:firstname>
            <author:lastname>Rowling</author:lastname>
            <rel:isAuthorOf rdf:resource="&book;Harry_Potter"/>
        </author:Woman>
    
        <author:Gender rdf:about="&author;male"/>
    
        <author:Gender rdf:about="&author;female"/>
    
        <book:Book rdf:about="&book;Jurassic_Park">
            <book:title>Jurassic Park</book:title>
        </book:Book>
    
        <book:Book rdf:about="&book;Die_Schatzinsel">
            <book:title>Die Schatzinsel</book:title>
            <book:genre>Abenteuer</book:genre>
            <rel:wasWrittenBy rdf:resource="&author;RLStevenson"/>
        </book:Book>
    
        <book:Book rdf:about="&book;Harry_Potter">
            <book:title>Harry Potter</book:title>
            <book:genre>Fantasy</book:genre>
        </book:Book>
    
    </rdf:RDF>
    Zunächst wüsste ich gern, ob die Ontologie so korrekt ist. Insbesondere verwirrt mich, dass einige Internetquellen eine OWL-Klasse mit dem Attribut rdf:ID und andere mit rdf:about deklarieren. Ist denn das das gleiche?
    Ein anderes Problem habe ich bei der Instanziierung einer OWL-Klasse. Wenn ich für "gender" einer Person statt dem Verweis auf &author;male einen der Buchverweise einsetze, sollte das normalerweise einen Fehler verursachen, da ich ja "gender" mit "Gender" verknüpft/beschränkt habe - tut es aber nicht, das Dokument wird einwandfrei geparst.
    Ja und dann habe ich die Ontologie im Online-Validator eingegeben unter:
    http://www.mygrid.org.uk/OWL/Validator
    Der Validator gibt für OWL Full keine Fehler aus, allerdings folgende Fehler für OWL DL, die ich absolut nicht erklären kann:
    * Individual Value: restriction(http://bibliothek.de/Beziehungen/gender value (http://bibliothek.de/Autoren/male))
    * Individual Value: restriction(http://bibliothek.de/Beziehungen/gender value (http://bibliothek.de/Autoren/female))

    Die Hauptschwierigkeit habe ich allerdings mit der Formulierung von SPARQL-Anfragen.
    Die Anfrage "Gib mir alle vorhandenen Bücher mit den dazugehörigen Genres aus" lässt sich ja noch recht einfach formulieren:
    Code:
    PREFIX book: <http://bibliothek.de/Buecher/>
    SELECT ?title ?genre
    WHERE {
      ?temp book:title ?title .
      OPTIONAL { ?temp book:genre ?genre . }
    }
    Problematisch ist aber beispielsweise die Verwendung regulärer Ausdrücke:
    Code:
    PREFIX book: <http://bibliothek.de/Buecher/>
    SELECT ?title ?genre
    WHERE {
      ?temp book:title ?title .
      ?temp book:genre ?genre .
      FILTER (regex(?title, "^H*")) .
    }
    Normalerweise dürfte jetzt nur "Harry Potter" ausgegeben werden - dummerweise wird aber auch "Die Schatzinsel" ausgegeben - verstehe ich nicht.

    Dann wüsste ich gern, ob mir jemand den Unterschied zwischen den beiden folgenden Anfragen erklären kann:
    Code:
    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX author: <http://bibliothek.de/Autoren/>
    SELECT ?person
    WHERE {
      ?person rdf:type author:Man .
    }
    und
    Code:
    PREFIX owl: <http://www.w3.org/2002/07/owl#>
    PREFIX author: <http://bibliothek.de/Autoren/>
    PREFIX rel: <http://bibliothek.de/Beziehungen/>
    SELECT ?person
    WHERE {
      ?person a [
        owl:intersectionOf (
          author:Man
          [
            owl:onProperty rel:gender
          ]
        )
      ]
    }
    Beide Anfragen sollten alle männlichen Personen ermitteln und tun dies auch. Trotzdem muss es ja einen Unterschied geben.

    Außerdem finde ich merkwürdig, dass folgende Deklaration zu viele Ergebnisse liefert:
    Code:
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX author: <http://bibliothek.de/Autoren/>
    SELECT ?person
    WHERE {
      ?person rdfs:subClassOf author:Person .
    }
    Sollten dadurch nicht eigentlich alle Individuen geliefert werden, die als Subklasse von "Person" instanziiert wurden? Die Ergebnismenge enthält jedoch auch "Thing" und "Person", beide sind normalerweise keine Subklassen von "Person" und dürften damit eigentlich auch nicht geliefert werden.

    Vielen Dank schonmal für eure Hilfe und viele Grüße
Working...
X