2013-03-03 12 views
9

Scheint, dass ich SPARQL DESCRIBE Abfragen nicht. Ich muss die vollständigen Graphen der Ressourcen abrufen, die einer Bedingung entsprechen. Auf der einen SPARQL-Endpunkt Ich habe versucht (Norwegian Rådata Nå, http://data.bibsys.no/data/query_authority.html) dies ganz gut funktioniert:SPARQL DESCRIBE Query

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

DESCRIBE ?person WHERE { 
    ?person rdf:type foaf:Person . 
    FILTER EXISTS { ?person owl:sameAs ?sameAs } 
} 
LIMIT 100 

ich ein Ergebnis mit Person Ressourcen erhalten, die eine Eule haben: sameAs verdreifachen.

Auf anderen SPARQL Endpunkten Onki Light (http://sparql.onki.fi/sparql.tpl) und DBPedia (http://dbpedia.org/sparql) eine ähnliche Abfrage

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 

DESCRIBE ?x WHERE { 
    ?x rdf:type skos:Concept . 
    FILTER EXISTS { ?x skos:prefLabel ?prefLabel } 
} 
LIMIT 100 

kehrt viele Ressourcen, die weder rdf haben: Typ = skos: Konzept noch ein skos: prefLabel, so Ich mache die Anfrage offensichtlich nicht korrekt. Wie sollte diese Art von Abfrage angegeben werden, um das Ergebnis zu erzeugen, das ich brauche?

Antwort

10

Die „erhielt Ressourcen“ ohne skos:prefLabel oder skos:Concept sind wahrscheinlich auf eine Ressource im Zusammenhang, die Ihren Anforderungen entspricht.

Die SPARQL DESCRIBE-Abfrage gibt tatsächlich keine Ressourcen zurück, die dem Diagrammmuster der Abfrage entsprechen, sondern ein RDF-Diagramm, das diese Ressourcen "beschreibt". Es ist Sache des Sparql-Dienstes, zu wählen, welche Tripel zur Beschreibung einer Ressource enthalten sind. (Siehe Standard unten)

Die W3C Proposed Recommendation on SPARQL 1.1 sagt:

Die DESCRIBE Form liefert ein einzelnes Ergebnis RDF Graph enthält RDF-Daten über Ressourcen. [...] Die Beschreibung wird vom Abfrageservice bestimmt.

Also, die Ressourcen unerwartet vielleicht erhalten die Ressourcen beschreiben Sie eigentlich wollen. Um Ihr Problem zu untersuchen: Überprüfen Sie die Tripel, die Sie tatsächlich für eine Beziehung zu Ihrer gewünschten Ressource erhalten sollten. Ein guter Weg ist, mit LIMIT 1 zu beginnen, um den Effekt von DESCRIBE-Abfragen zu sehen.

Vielleicht ist eine SELECT-Abfrage, was Sie brauchen? Es gibt nur die Ressourcen zurück, die dem Diagrammmuster entsprechen.

+0

Danke! Ich habe DESCRIBE ausprobiert und die erwartete Ressource und eine Reihe von verwandten Ressourcen erhalten, genau wie Sie schreiben. SELECT oder CONSTRUCT sind in dem vorliegenden Fall keine brauchbaren Optionen, da ich die tatsächliche Struktur der Daten nicht kenne. Aber wenn ich weiß, was die "zusätzlichen" Ressourcen sind, kann ich sie einfach ignorieren, wenn ich das Ergebnis verarbeite. –

1

SELECT oder CONSTRUCT sind nicht tragfähige Optionen in dem Fall auf der Hand, da ich weiß, nicht die tatsächliche Struktur der Daten

Warum sagst du das tun? Ich denke, dass Sie entweder nur die Ressourcen erhalten möchten:

select ?x WHERE { 
    ?x rdf:type skos:Concept . 
    FILTER EXISTS { ?x skos:prefLabel ?prefLabel } 
} 
LIMIT 100 

oder alle ihre scheidenden Tripel:

select ?x ?p ?y WHERE { 
    ?x rdf:type skos:Concept. 
    FILTER EXISTS { ?x skos:prefLabel ?prefLabel } 
    ?x ?p ?y 
} 
LIMIT 100 
+0

Danke! Ich habe so etwas probiert, aber die SPARQL-Syntax verpfuscht. Das nächste Problem ist der beste Weg, um ein tatsächliches Diagramm aus dem SPARQL XML-Ergebnis zu erstellen. –

1

Wie @Thomas erwähnt, wird DESCRIBE ein wenig von der Norm underspecified, daher werden Sie erhalten inkonsistente Ergebnisse. Unter Verwendung von CONSTRUCT können Sie jedoch zurückgeben, was viele Engines für DESCRIBE zurückgeben, d. H. SPO plus OPS, und zwar konsistent über alle Dienste hinweg.Hier ist eine Abfrage, die dies tut:

CONSTRUCT { 
    ?person ?p ?o . 
    ?s ?p1 ?person . 
} 
WHERE { 
    ?person rdf:type foaf:Person . 
    FILTER EXISTS { ?person owl:sameAs ?sameAs } . 
    ?person ?p ?o . 
    ?s ?p1 ?person . 
} 

Diese bekommt man eine RDF Graph, dass „beschreibt“ die Ressourcen gebunden ?person, nämlich alle Eigenschaften von ?person und alle Eigenschaften, deren Wert (Objekt) ist Person?.

+0

Interessant! Ich habe dies auf dbpedia versucht (der Rådata Nå SPARQL-Endpunkt funktioniert zur Zeit nicht): PREFIX rdf: PREFIX skos: CONSTRUCT { ? Konzept? p? o. ? S? P1? Konzept. } WHERE { ? Konzept rdf: Typ skos: Konzept. FILTER EXISTS {? Konzept skos: prefLabel? PrefLabel}. ? Konzept? P? O. ? S? P1? Konzept. } LIMIT 100 Mit gemischten Ergebnissen. Einige Daten sind genau das, was ich will, andere nicht die Bedingungen. –

+0

Versuchen Sie, das LIMIT zu erhöhen. SPARQL erhält keine Daten in einer bestimmten Reihenfolge, daher könnten Sie auch LIMIT/OFFSET-Kombinationen mit ORDER BY versuchen. – scotthenninger