2017-07-25 2 views
2

Ich habe eine Ontologie so etwas wie:einen leeren Knoten als eine Art verwendet, abrufen

:indi_1 a :Segment; a [ :builds only {:indi_2}]; :hasID 1. 

Jetzt möchte ich die Person finden (s), die indi_1 baut. Ich habe die folgende Abfrage:

SELECT distinct ?a 
WHERE {:indi_1 a ?b. ?b a _:blankNode} 

aber ich habe noch das Segment in meine Ergebnisse erzielen. Außerdem kann ich nicht innerhalb des leeren Knotens erreichen, um die indi_2 zu retrollen.

Wie soll ich meine Abfrage erstellen?

Antwort

4

Ich weiß nicht, warum Sie b a erwarten würde: blankNode zu verlangen, dass b ein leerer Knoten ist?. : blankNode ist ein leerer Knoten, der in einer SPARQL-Abfrage wie diese als eine Variable fungiert, so ist es nur erforderlich, dass ? B hat einen Typ. Ihre Anfrage wie geschrieben ist nicht einmal legal. Es sieht so aus, als ob Sie stattdessen :indi_1 a ?b . ?b a _:blankNode wollen (beachten Sie die ., keine ;).

Auf jeden Fall etwas einen leeren Knoten zu prüfen, ob, Blick auf den SPARQL 1.1 spec, und feststellt, dass es eine isBlank Funktion ist. Das würden Sie verwenden, um Ihre Ergebnisse zu filtern. Sie würden so etwas wie dieses:

select * { 
    ?a a ?b 
    filter isBlank(?b) 
} 

Aber wenn das, was Sie eigentlich suchen sie die Liste der Personen ist, müssen Sie tatsächlich ein wenig enger an der RDF-Serialisierung Ihrer Daten zu suchen. Sie kümmern sich eigentlich nicht, dass ? B leer ist, sondern eher, dass es eine Einschränkung mit den richtigen Eigenschaften ist. Von einem Axiom wie:

        : a baut nur {b, c}

Sie mit RDF am Ende wie folgt:

:a  a  owl:NamedIndividual , owl:Thing ; 
     a  [ a     owl:Restriction ; 
        owl:allValuesFrom [ a   owl:Class ; 
             owl:oneOf (:c :b) 
            ] ; 
        owl:onProperty  :builds 
       ] . 

So Ihre Abfrage wäre :

prefix :  <http://www.example.org/> 
prefix owl: <http://www.w3.org/2002/07/owl#> 
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

select ?x ?y { 
    ?x a [ owl:allValuesFrom [ owl:oneOf/rdf:rest*/rdf:first ?y ] ] . 
} 
----------- 
| x | y | 
=========== 
| :a | :c | 
| :a | :b | 
----------- 

Sie können das Reinigen ein wenig mit mehr Eigenschaft Pfaden bis:

select ?x ?y { 
    ?x rdf:type/owl:allValuesFrom/owl:oneOf/rdf:rest*/rdf:first ?y . 
} 

OWL ist nicht das gleiche wie RDF. SPARQL ist eine RDF-Abfragesprache. OWL kann als RDF serialisiert werden, aber die Serialisierung ist nicht immer so schön, daher ist SPARQL nicht unbedingt der beste Weg, um OWL abzufragen, obwohl OWL in RDF serialisiert werden kann. Es ist so, als würde man in einem Dokument nach Text suchen, indem man nach bestimmten Bytes oder Bits in der Datei sucht. Es könnte funktionieren, aber wenn jemand die Zeichencodierung ändern würde, könnten Sie die gleiche Text, aber andere Bytes oder Bits, so dass die Abfrage möglicherweise nicht mehr funktionieren.

+0

Oder verwenden Sie etwas wie SPARQL DL, wenn die Ontologie in den Speicher passt und kein CWA benötigt wird. – AKSW

+0

Die Abfrage, die Sie vorschlagen, funktioniert für mich. Danke vielmals!Soweit ich weiß, muss ich für SPARQL DL meine Ontologie begründen lassen, was nicht möglich ist, da es zu komplex ist, um begründet zu werden. Also entziehe ich Informationen auf eine harte Art durch das Codieren. Deshalb brauchte ich diese Abfrage. – msc87

Verwandte Themen