2016-09-30 60 views
2

我目前使用的http://dbpedia.org/snorql網站推出類似下面的一些基本要求:過濾SPARQL結果由日,月

PREFIX dbpedia0: <http://dbpedia.org/ontology/> 
SELECT ?body ?value WHERE { 
?body a dbpedia0:Person. 
?body dbpedia0:birthDate ?value. 
} 
ORDER BY ?value 

我想找個過濾結果的方式這樣纔有人出生日期XY正在選擇(無論出生年份)。我一直在嘗試了許多方法,如這樣做:

1)基本過濾:FILTER(xsd:date(?value) = "2000-01-01"^^xsd:date) 但我不現在如何確切的事實,我不關心這一年...

2)使用MONTH()DAY()函數應該導致整數值代表月份和日期......但是這些似乎不起作用,因爲我的日期類型被認爲是一個無效的輸入參數。

3)將日期轉換爲字符串變量。然後測試此字符串變量(對應於月份和日期)的結束字符是否與所需的月份和日期匹配。這將是這樣的:FILTER(STRENDS(CONVERT(CHAR, ?value),"01-01") = true)

顯然,上面列出的方法都沒有適當的工作......哈哈。 請不要責怪我的請求糟糕的語法,因爲我剛剛開始使用SPARQL命令。

我會非常感謝任何幫助或其他在那裏!

+0

爲什麼添加標籤MYSQL和SQL?你爲什麼在談論「我剛剛開始使用SQL」命令? SPARQL!= SQL – AKSW

+0

並且格式化問題也有幫助,請按照http://stackoverflow.com/help/formatting – AKSW

+0

DBpedia數據是非常不同的,尤其是日期文字是xsd:date,xsd:dateTime,xsd:gYear,等等這使得它非常難以投射和過濾 – AKSW

回答

2

您收到錯誤,因爲(正如我在評論中所說)並非所有文字都是,或可以是CAST,輸入xsd:date。一個filter爲可以工作

PREFIX dbpedia0: <http://dbpedia.org/ontology/> 
SELECT ?body ?value WHERE 
    { 
    ?body a     dbpedia0:Person . 
    ?body dbpedia0:birthDate ?value   . 
      FILTER ( datatype(?value) = xsd:date 
        &&  year(?value) = 2000 
       ) 
    } 
limit 10 

錯誤:

Virtuoso 22003 Error SR586: Incomplete RDF box as argument 0 for year(). 

另一種嘗試cast ING導致我的印象是FILTER參數在任意順序執行,並導致另一個錯誤:

PREFIX dbpedia0: <http://dbpedia.org/ontology/> 
SELECT ?body ?value 
WHERE 
    { 
    ?body a     dbpedia0:Person . 
    ?body dbpedia0:birthDate ?value   . 
      FILTER (  datatype(?value) = xsd:date 
        && year(xsd:date(?value)) = 2000 
       ) 
    } 
limit 10 

錯誤:

Virtuoso 22007 Error DT001: Function year needs a datetime, date or time as argument 1, not an arg of type DB_NULL (204) 

使用子SELECT小號似乎工作,但不是

PREFIX dbpedia0: <http://dbpedia.org/ontology/> 

SELECT ?body ?value 
WHERE 
    { 
      FILTER (year(xsd:date(?value)) = 2000) 
    { 
     SELECT ?body ?value 
     WHERE 
     { 
      ?body a     dbpedia0:Person . 
      ?body dbpedia0:birthDate ?value   . 
       FILTER (datatype(?value) = xsd:date) 
     } 
    } 
    } 
limit 10 

錯誤:

Virtuoso 22003 Error SR586: Incomplete RDF box as argument 1 for xqf_str_parse(). 
LIMITSELECT

只有它爲我工作:

PREFIX dbpedia0: <http://dbpedia.org/ontology/> 

SELECT ?body ?value 
WHERE 
    { 
      FILTER (year(xsd:date(?value)) = 2000) 
     { 
     SELECT ?body ?value 
     WHERE 
      { 
      ?body a     dbpedia0:Person . 
      ?body dbpedia0:birthDate ?value   . 
        FILTER (datatype(?value) = xsd:date) 
      } 
     LIMIT 10 
     } 
    } 
LIMIT 10 

我不知道Virtuoso在這裏出了什麼問題。