2017-07-04 6 views
2

Ich entwickle meinen eigenen Fuseki-Endpunkt aus einigen DBpedia-Daten. Ich habe Zweifel, wie man Eigenschaften in Bezug auf eine einzelne Ressource zusammenfasst.Aggregateigenschaften

SELECT ?name ?website ?abstract ?genre ?image 
WHERE{ 
VALUES ?s {<http://dbpedia.org/resource/Attack_Attack!>} 
    ?s foaf:name ?name ; 
     dbo:abstract ?abstract . 
    OPTIONAL { ?s dbo:genre ?genre } . 
    OPTIONAL { ?s dbp:website ?website } . 
    OPTIONAL { ?s dbo:image ?image } . 
    FILTER LANGMATCHES(LANG(?abstract), "en") 
} 

SPARQL-Endpunkt: http://dbpedia.org/sparql/

Diese Abfrage gibt 2 passenden Ergebnisse. Sie sind nur für den Wert dbo:genre unterschiedlich. Es gibt eine Möglichkeit, die Wissensdatenbank abzufragen und ein einzelnes Ergebnis mit einer Liste von genres abzurufen?

+2

Das erste dreifache Muster ist unnötig, da es eine Eigenschaft RDF triple ohne Variablen bezeichnet. Darüber hinaus kann 'VALUES' verwendet werden, um die Abfrage kompakter zu machen, siehe meine bearbeitete Abfrage. – AKSW

Antwort

3

@ chrisis Abfrage funktioniert gut auf dem DBpedia SPARQL Endpoint, der auf Virtuoso basiert.

Wenn Sie jedoch Jena Fuseki verwenden, sollten Sie mehr konformer Syntax:

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbp: <http://dbpedia.org/property/> 

SELECT 
?name 
(SAMPLE(?website) AS ?sample_website) 
(SAMPLE(?abstract) AS ?sample_abstract) 
(SAMPLE(?image) AS ?sample_image) 
(GROUP_CONCAT(?genre; separator=', ') AS ?genres) 
WHERE { 
    VALUES (?s) {(<http://dbpedia.org/resource/Attack_Attack!>)} 
    ?s foaf:name ?name ; 
     dbo:abstract ?abstract . 
    OPTIONAL { ?s dbo:genre ?genre } . 
    OPTIONAL { ?s dbp:website ?website } . 
    OPTIONAL { ?s dbo:image ?image} . 
    FILTER LANGMATCHES(LANG(?abstract), "en") 
} GROUP BY ?name 

Die Unterschiede aus der Abfrage @ Chrisis sind:

  • Da GROUP_CONCAT ist eine Funktion Aggregation, es könnte nur mit GROUP BY verwendet werden;
  • Da GROUP BY verwendet wird, sollten alle nicht gruppierenden Variablen aggregiert werden (z. B. über SAMPLE);
  • GROUP_CONCAT Syntax ist etwas anders.

In Fuseki diese AS in der Projektion sind in der Tat überflüssig: this question und Kommentare sehen.

+0

Das AS ist nicht überflüssig. Es ist durch die Spezifikation beauftragt. Wenn Sie versuchen, eine rechtliche Abfrage zu schreiben, sollte diese enthalten sein. Nur weil einige Endpoints mit der illegalen Syntax umgehen können, ist dies kein guter Grund, sie wegzulassen. –

+0

@JoshuaTaylor, ich habe die Antwort etwas bearbeiten. –

2

Ja, die GROUP_CONCAT() - Funktion ist, was Sie wollen.

SELECT ?name ?website ?abstract (GROUP_CONCAT(?genre,',') AS ?genres) ?image 
WHERE{ 
    <http://dbpedia.org/resource/Attack_Attack!> a dbo:Band ; 
     foaf:name ?name; 
     dbo:abstract ?abstract . 
    OPTIONAL{ <http://dbpedia.org/resource/Attack_Attack!> dbo:genre ?genre } . 
    OPTIONAL{ <http://dbpedia.org/resource/Attack_Attack!> dbp:website ?website} . 
    OPTIONAL{ <http://dbpedia.org/resource/Attack_Attack!> dbo:image ?image} . 
FILTER LANGMATCHES(LANG(?abstract), "en") 

}