2016-06-22 41 views
0

Ich versuche nach dem Datentyp in DBpedia zu filtern. Zum Beispiel:Nach Datentyp filtern

SELECT * 
WHERE {?s ?p ?o . 
    FILTER (datatype(?o) = xsd:integer) 
    } 
LIMIT 10 

Aber ich bekomme keine Ergebnisse, während es sicherlich ganzzahlige Werte gibt. Ich bekomme dasselbe von anderen Endpunkten mit Virtuoso, aber ich bekomme Ergebnisse von alternativen Endpunkten. Was könnte das Problem sein? Wenn Virtuoso diese SPARQL-Funktion nicht ordnungsgemäß implementiert, was sollte stattdessen verwendet werden?

+0

Dies scheint unwahrscheinlich Ihre eigentliche beabsichtigte Abfrage zu sein, und ich denke, Sie arbeiten möglicherweise an einem [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), Lösung, die Sie nicht viel näher an den ultimativen Erfolg bringen kann. Oft ist es am besten, eine Vorstellung davon zu bekommen, woran Sie wirklich arbeiten, daher kann Beratung relevanter sein. – TallTed

+0

Ja, das ist nicht meine eigentliche Abfrage. Für mein eigentliches Problem wollte ich ein ähnliches Beispiel mit DBpedia geben, da mein Endpunkt nicht öffentlich ist. Und dabei habe ich dieses Problem entdeckt, das ich ernst finde und gerne eine Lösung dafür finden würde. (Mein eigentliches Problem ist das ein 'FILTER (? Jahr> ...)' wenn ich 'BIND (Jahr (? X) als? Jahr) habe' wo? X ist von xsd: dateTime, gibt Fehler, aber ich werde frage das separat.) –

Antwort

4

Dies ist eine teure Abfrage, da sie alle Tripel durchlaufen muss (?s ?p ?o .). Die Ausführungszeit der Abfrage überschreitet die maximale Zeit, die für die Instanz Virtuoso konfiguriert wurde, die den SPARQL-Endpunkt von DBpedia unter http://dbpedia.org/sparql bedient. Wenn Sie den Parameter timeout nicht verwenden, erhalten Sie einen Zeitüberschreitungsfehler (Virtuoso S1T00 Error SR171: Transaction timed out). Wenn Sie die Verwendung timeout (standardmäßig auf 30000 für den DBpedia Endpunkt), werden Sie unvollständige Ergebnisse, die HTTP-Header wie diese enthalten:

X-SQL-State: S1TAT 
X-SQL-Message: RC...: Returning incomplete results, query interrupted by result timeout. Activity: 1.389M rnd 5.146M seq  0 same seg 55.39K same pg 195 same par  0 disk  0 spec disk  0B/ 0 me 

Leere so erhaltenen Ergebnisse unvollständig sein und es muss nicht gibt an, dass in DBpedia keine xsd:integer Literale vorhanden sind. Eine verwandte Diskussion über die Teilergebnisse in Virtuoso finden Sie here.

Als Lösung für Ihre Abfrage können Sie die DBpedia von dumps laden und lokal analysieren.

Als eine Randnotiz ist Ihre Abfrage syntaktisch ungültig, weil es Namespace für das Präfix xsd fehlt. Sie können die Syntax von SPARQL-Abfragen über SPARQLer Query Validator überprüfen. Sie können die Namespaces für gemeinsame Präfixe mit Prefix.cc finden. Virtuoso, das den DBpedia SPARQL-Endpunkt bereitstellt, ignoriert den fehlenden Namespace für das Präfix xsd. Es ist jedoch eine gute Vorgehensweise, sich für eine größere Interoperabilität an syntaktisch gültige SPARQL-Abfragen zu halten.

+1

Ich habe es mit und ohne 'xsd'-Präfix getestet und bisher auf allen Virtuoso-Endpunkten, solange ich die deklarierten Präfixe verwende (zB http://dbpedia.org/sparql?nsdecl für dbpedia) Ich habe keinen Unterschied in den Ergebnissen. –

+0

* Dies * scheint kein Problem zu sein, wie ausführlich von @jindrichm besprochen, und wie von [dieser Abfrage bestätigt, über eine kleinere Anzahl von Tripeln, mit Ihrem gleichen 'FILTER'] (http: // dbpedia. org/sparql? default-graph-uri = http% 3A% 2F% 2Fdbpedia.org & qtxt = PREFIX ++ xsd% 3A ++ % 0D% 0ASELECT + DISTINCT +% 3Fp +% 3Fo +% 0D% 0AWHERE + {+ +% 3Fp +% 3Fo +% 0D% 0A +++++++++ FILTER + (+ Datentyp (% 3Fo) +% 3D + xsd% 3Ainteger +)% 0D% 0A ++++++}% 0D% 0ALIMIT + 100 & format = Text% 2Fhtml & CXML_redir_for_subjs = 121 & CXML_redir_for_hrefs = & timeout = 30000 & debug = on) – TallTed

+0

@IvoVelitchkov: Das Hauptproblem liegt in Teilergebnissen, nicht im fehlenden Präfix . Danke, dass Sie die Standard-Namespace-Deklarationen unter erwähnt haben. Ich war mir dieser Funktion nicht bewusst. –