2010-05-28 10 views
41

Wann immer ich sql benutze, tendiere ich dazu, ein paar explorative Anweisungen in der Datenbank zu werfen, um zu verstehen, was verfügbar ist und welche Form die Daten haben.explorative SPARQL-Abfragen?

z.

Könnte mir jemand helfen, den Weg zu verstehen, eine ähnliche Erkundung eines RDF-Datenspeichers mit einem SPARQL-Endpunkt durchzuführen?

Thanks :)

Antwort

69

Nun, der offensichtliche erste Start ist in den Klassen und Eigenschaften, die in den Daten zu suchen.

Hier ist, wie zu sehen, welche Klassen verwendet werden.

SELECT DISTINCT ?class 
WHERE { 
    ?s a ?class . 
} 
LIMIT 25 
OFFSET 0 

(LIMIT und OFFSET gibt es für das Paging Es lohnt sich, diese Gewöhnung vor allem, wenn Sie Ihre Anfrage über das Internet senden ich. ‚ll sie in den anderen Beispielen weglassen)

a ist eine besondere SPARQL (und Notation3/Turtle) Syntax, um das rdf:type Prädikat darstellen -. dies verbindet einzelne Instanzen zu owl:Class/rdfs:Class Typ s (entspricht ungefähr den Tabellen in SQL RDBMSes).

Zweitens möchten Sie die Eigenschaften betrachten. Sie können dies tun, indem Sie entweder die Klassen verwenden, nach denen Sie gesucht haben, oder einfach nach Eigenschaften suchen. Lassen Sie uns einfach alle Eigenschaften aus dem Laden:

SELECT DISTINCT ?property 
WHERE { 
    ?s ?property ?o . 
} 

Diese alle Eigenschaften erhalten, die Sie wahrscheinlich nicht interessiert sind diese zu einer Liste aller Zeile Spalten in SQL entspricht, aber ohne. irgendeine Gruppierung durch die Tabelle.

Nützlicher sind, um zu sehen, welche Eigenschaften von Instanzen verwendet werden, die eine bestimmte Klasse deklariert:

SELECT DISTINCT ?property 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
} 

Dadurch werden Sie wieder die Eigenschaften auf allen Instanzen gewöhnen, dass die ersten Triple erfüllen - nämlich die haben die rdf:type von http://xmlns.com/foaf/0.1/Person.

Denken Sie daran, weil eine rdf: Resource mehrere rdf: type-Eigenschaften haben kann - Klassen, wenn Sie so wollen - und weil das RDF-Datenmodell additiv ist, haben Sie kein Diamantproblem. Der Typ ist nur eine andere Eigenschaft - es ist nur eine nützliche soziale Vereinbarung zu sagen, dass einige Dinge Menschen oder Hunde oder Gene oder Fußballmannschaften sind. Es bedeutet nicht, dass der Datenspeicher Eigenschaften enthalten wird, die normalerweise diesem Typ zugeordnet sind. Der Typ garantiert nichts in Bezug auf die Eigenschaften einer Ressource.

Sie müssen sich mit dem Datenmodell und der Verwendung von SPARQLs UNION- und OPTIONAL-Syntax vertraut machen. Die grobe Zuordnung von rdf: type zu SQL-Tabellen ist genau das - grob.

Sie möchten vielleicht wissen, auf welche Art von Entity die Eigenschaft verweist. Zunächst möchten Sie wahrscheinlich die Eigenschaften von Datentypen kennenlernen - das entspricht Literalen oder Primitiven. Sie wissen, Strings, Integer usw. RDF definiert diese Literale als alle von String erben.Wir können nur jene Eigenschaften herauszufiltern, die Literale mit der SPARQL-Filter-Methode sind isLiteral:

SELECT DISTINCT ?property 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
    FILTER isLiteral(?o) 
} 

Wir sind hier nur Objekte in Gang bringen, die zum Gegenstand haben eine wörtliche - eine Zeichenkette, Datum-Zeit, boolean oder einer der anderen XSD-Datentypen.

Aber was ist mit den nicht-literalen Objekten? Betrachten Sie diese sehr einfache Pseudo-Java-Klassendefinition als Analogie:

public class Person { 
    int age; 
    Person marriedTo; 
} 

die obige Abfrage verwenden, würden wir die wörtliche zurückbekommen, das Alter, wenn die Alte Eigenschaft gebunden ist darstellen würde. Aber marriedTo ist kein Primitiv (d. H. Ein Literal in RDF-Termen) - es ist eine Referenz auf ein anderes Objekt - in der RDF/OWL-Terminologie ist das eine Objekteigenschaft. Aber wir wissen nicht, auf welche Art von Objekten sich diese Eigenschaften beziehen (Prädikate). Diese Abfrage wird Ihnen Eigenschaften mit den zugehörigen Typen zurückgeben.

SELECT DISTINCT ?property, ?class 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
    ? a ?class . 
    FILTER(!isLiteral(?o)) 
} 

Das sollte reichen, um sich in einem bestimmten Datensatz zu orientieren. Natürlich würde ich auch empfehlen, dass Sie nur einzelne Ressourcen herausziehen und diese überprüfen. Sie können tun, dass die Abfrage DESCRIBE mit:

DESCRIBE <http://example.org/resource> 

Es gibt einige SPARQL Werkzeuge - SNORQL, zum Beispiel -, die Sie tun dies in einem Browser lassen. Die SNORQL-Instanz, mit der ich verlinkt bin, hat eine Beispielabfrage, um die möglichen benannten Graphen zu untersuchen, die ich hier nicht behandelt habe.

Wenn Sie mit SPARQL nicht vertraut sind, ist die beste Ressource, wenn Sie stecken bleiben, die Spezifikation. Es ist eine W3C-Spezifikation, aber eine ziemlich gute (sie haben eine anständige Testsuite erstellt, so dass Sie sehen können, ob Implementierungen es richtig gemacht haben oder nicht) und wenn Sie die komplizierte Sprache überwinden können, ist das ziemlich hilfreich.

+0

flach aus ehrfürchtiger Antwort - dank sehr viel Tom! – significance

+0

Ich weiß, ich sollte nicht einfach posten "Danke!"Nachrichten über SO, aber Sie haben gerade ein SPARQL-Noob ernsthaft ausgeholfen, also:" Danke! ". –

1

Ich beziehe mich oft auf diese list of queries from the voiD project. Sie sind hauptsächlich statistischer Natur, aber nicht nur. Es sollte nicht schwer sein, die COUNTs aus einigen Anweisungen zu entfernen, um die tatsächlichen Werte zu erhalten.

6

finde ich den folgenden Satz von Sondierungs Abfragen nützlich:

sieht die Klassen:

select distinct ?type ?label 
where { 
    ?s a ?type . 
    OPTIONAL { ?type rdfs:label ?label } 
} 

sieht die Eigenschaften:

select distinct ?objprop ?label 
where { 
    ?objprop a owl:ObjectProperty . 
    OPTIONAL { ?objprop rdfs:label ?label } 
} 

sieht die Dateneigenschaften:

select distinct ?dataprop ?label 
where { 
    ?dataprop a owl:DatatypeProperty . 
    OPTIONAL { ?dataprop rdfs:label ?label } 
} 

sehen, welche Eigenschaften tatsächlich verwendet werden:

select distinct ?p ?label 
where { 
    ?s ?p ?o . 
    OPTIONAL { ?p rdfs:label ?label } 
} 

Sehen, was Entitäten geltend gemacht werden:

select distinct ?entity ?elabel ?type ?tlabel 
where { 
    ?entity a ?type . 
    OPTIONAL { ?entity rdfs:label ?elabel } . 
    OPTIONAL { ?type rdfs:label ?tlabel } 
} 

die unterschiedlichen graphischen Darstellungen in Gebrauch sehen:

select distinct ?g where { 
    graph ?g { 
     ?s ?p ?o 
    } 
}