2014-02-10 9 views
5

ist ich geschrieben habe, die folgende Abfrage:Nach Sprache filtern nur, wenn das Objekt eine wörtliche

SELECT DISTINCT 
    ?predicate 
    ?object 
    ?label 
WHERE { 
    VALUES  ?subject  { <http://dbpedia.org/resource/Hercules_(1997_film)> } 
    ?subject  ?predicate ?object . 
    ?predicate rdfs:label ?label . 
    FILTER(langMatches(lang(?object), "EN")) 
} 
LIMIT 100 

Wenn ich die FILTER Linie auf diese Weise zu schreiben, habe ich im Wesentlichen alle Nicht-Literalen herausgefiltert (Seite Frage: sind Literale der einzige Typ, der eine Sprach-Tag haben kann)

Also, wie halte ich alle meine Ergebnisse und auszufiltern nicht-Englisch-Literale nur?

Antwort

4

Sie könnten die isLiteral function verwenden, um die Spracheinschränkung nur auf Objekte anzuwenden, die Literale sind.

x impliziert y kann mit SPARQL-Operatoren wie ausgedrückt werden! X ||

SELECT DISTINCT 
    ?predicate 
    ?object 
    ?label 
WHERE { 
    VALUES  ?subject  { <http://dbpedia.org/resource/Hercules_(1997_film)> } 
    ?subject  ?predicate ?object . 
    ?predicate rdfs:label ?label . 
    FILTER(!isLiteral(?object) || langMatches(lang(?object), "EN")) 
} 
LIMIT 100 

Wie für die sekundäre Frage, die description for language tags from the RDF concepts and abstracts erwähnt nur Sprach-Tags erscheinen als Teil Ebene Literale: y, so könnten Sie Ihre Abfrage so schreiben. Ebenso verwendet die grammar in the SPARQL 1.1 specification die LANGTAG nonterminal nur in der RDFLiteral production als eine exklusive Alternative anstelle eines Datentyps IRI.

+0

Im Allgemeinen funktioniert das, obwohl ich am Ende eine zweite Zeile 'FILTER' hinzufüge: eine Zeile bezieht sich auf'? Object' und eine andere bezieht sich auf '? Label'. – Kristian

+1

@Kristian: Sie können das Schlüsselwort '' OPTIONAL' '(http://www.w3.org/TR/sparql11-query/#OptionalMatching) in Betracht ziehen, um alles zu überprüfen, was mit dem Label zu tun hat, wie in einigen Datasets, nicht Alle Ressourcen sind mit einem Label versehen. –

+0

Ich werde, danke für den Vorschlag – Kristian