在SPARQL过滤器中包括一系列“可能的”日期

时间:2019-02-17 09:21:47

标签: datetime filter sparql dbpedia

我正在研究一个DBPedia项目,以寻找在1960年代(大约)一直活跃的女歌手。

不幸的是,当我尝试选择一系列活跃于1955年至1972年的歌手时,我错过了1955年之前活跃的歌手(结果否定了一些歌手,例如1925-1973年活跃的Umm Kulthum)。

下面是我的代码,它显示了过滤器仅包括在该日期范围内活跃的艺术家的位置。我想创建一个过滤器,说“给我所有在该日期范围内尤其活跃于音乐领域的歌手,但还包括那些可能在之前(包括)时期活跃的歌手日期范围”?我不希望那些仅在此日期范围之前处于活动状态的应用程序。

PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/resource/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX dbc: <http://dbpedia.org/resource/Category:>

SELECT distinct ?name ?person ?thumbnail ?birthDate ?active
 where {
?person foaf:name ?name . 
?person dct:subject ?subject.
?person dbo:birthDate ?birthDate.
OPTIONAL {?person dbo:thumbnail ?thumbnail}
OPTIONAL {?person dbo:activeYearsStartYear ?active}

{ ?person a dbo:MusicalArtist . 
filter exists {?person 
dct:subject/skos:broader*dbc:Female_singers_by_nationality}}

filter (?active > '1955-04-18T22:29:33.667Z'^^xsd:dateTime && ?active < 
'1974-01-01T21:37:37.708Z'^^xsd:dateTime)} order by ?active

1 个答案:

答案 0 :(得分:0)

一种解决方案是还使用布尔值or在过滤器中检查反向。像这样:

SELECT distinct ?name ?person ?thumbnail ?birthDate ?activeStart ?activeEnd 
where {
  ?person foaf:name ?name . 
  ?person dct:subject ?subject.
  ?person dbo:birthDate ?birthDate. 
  ?person dbo:activeYearsStartYear ?activeStart. 
  ?person dbo:activeYearsEndYear ?activeEnd 
  OPTIONAL {?person dbo:thumbnail ?thumbnail }
  { ?person a dbo:MusicalArtist . 
    filter exists {
        ?person dct:subject/skos:broader* dbc:Female_singers_by_nationality
    }
  } 
  BIND('1955-04-18T22:29:33.667Z'^^xsd:dateTime as ?startPeriod) 
  BIND('1974-01-01T21:37:37.708Z'^^xsd:dateTime as ?endPeriod) 
  filter ( (?activeStart > ?startPeriod && ?activeStart < ?endPeriod) 
         || (?activeStart < ?startPeriod && ?activeEnd > ?startPeriod))
} 
order by ?activeStart