2016-04-17 4 views
0

Wie kann ich Zahlen im Allgemeinen und Datumsangaben insbesondere in SPARQL erhöhen? Konkret habe ich einen Filter, um mir nur heute geborene Menschen zu bringen: FILTER (STRLEN(STR(?born)) > 6 && (SUBSTR(STR(?born),6)=SUBSTR(STR(bif:curdate('')),6)). Wie kann ich diesen Filter erweitern, damit ich auch in den nächsten zwei Tagen Menschen geboren bekomme?Wie kann man Daten in SPARQL inkrementieren?

(kann ich akzeptieren/ignorieren oder die Verwendung der privaten Funktion korrigieren)

UPDATE

Da die vorgeschlagene Lösung nicht auf DBpedia funktionierte, ich habe es mit Virtuoso private Funktion implementiert, aber ich habe keine Ahnung, außer der Verwendung von UNION, wie man den Filter auswechselt oder eine andere elegante Lösung findet, damit ich heute, morgen und übermorgen Menschen geboren bekomme. Derzeit ist dieser Teil der Abfrage sieht wie folgt aus:

BIND ((SUBSTR(STR(?born),6)=SUBSTR(STR(now()),6,5)) as ?tday) 
BIND ((SUBSTR(STR(?born),6)=SUBSTR(STR(bif:dateadd("day", 1, now())),6,5)) as ?tday1) 
BIND ((SUBSTR(STR(?born),6)=SUBSTR(STR(bif:dateadd("day", 2, now())),6,5)) as ?tday2) 

FILTER (STRLEN(STR(?born)) > 6) 
FILTER (?tday) . 

Ersetzen ?tday mit ?tday1 und ?tday2' funktioniert gut, aber wie alle drei Tage, im Ergebnis?

+0

Wenn Ihr Endpunkt Dauer Literale unterstützt, können Sie nur in der Lage sein, eine zweitägige Dauer auf das Datum hinzufügen ... verwenden Sie Virtuose? –

+0

Ja, Virtuose. Wenn ich heute laufe, möchte ich 04-17, -18, -19 bekommen. Aber dann, wenn ich es am 29. fahre, möchte ich natürlich 04-29, 04-30 und 05-01. Ich dachte, in anderen Fällen 'op: numeric-add' zu verwenden, aber mit Daten ... keine Ahnung. –

+1

Datum und DatumTimes können xsd: duration sein. – AndyS

Antwort

0

Nach einigen Versuchen, fand ich die Lösung, die für mich gut funktioniert. Hier nehme ich alle heute und in den nächsten 7 Tagen geboren:

values ?d {0 1 2 3 4 5 6 7} 

BIND ((SUBSTR(STR(?born),6) as ?bornSTR)) 
BIND ((SUBSTR(STR(bif:dateadd("day", ?d, now())),6,5)) as ?day) 

FILTER (STRLEN(STR(?born)) > 6 && STR(?bornSTR) = STR(?day)) 
2

Wenn Ihr Endpunkt Dauer Arithmetik unterstützt, können Sie eine Dauer auf das Datum hinzuzufügen. Zum Beispiel, hier wir eine Dauer von zwei Tagen zu einem Datum hinzufügen und das richtige Verhalten sehen, wo das Enddatum auf den nächsten Monat umschlingt:

prefix xsd: <http://www.w3.org/2001/XMLSchema#> 

select ?begin ?end where { 
    values ?begin { "2005-02-28T00:00:00Z"^^xsd:dateTime } 
    values ?duration { "P2DT0H0M0.000S"^^xsd:duration } 
    bind((?begin + ?duration) as ?end) 
} 
----------------------------------------------------------------------------------- 
| begin        | end          | 
=================================================================================== 
| "2005-02-28T00:00:00Z"^^xsd:dateTime | "2005-03-02T00:00:00.000Z"^^xsd:dateTime | 
----------------------------------------------------------------------------------- 
+0

Ich verwende DBpedia und dort funktioniert es nicht mit 'xsd: duration'. –