在 SPARQL 过滤器中包含 "possible" 个日期范围

Include a range of "possible" dates in a SPARQL filter

我正在开展 DBPedia 项目,以寻找 1960 年代(大约)活跃的女歌手。

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

我的代码在下面,显示过滤器仅包括专门在此日期范围内活跃的艺术家。我想创建一个显示 "give me all singers who would have been musically active during the this date range in particular, but also include those who might have been active from a period before and including this date range" 的过滤器?我不想要那些只在此日期范围之前活跃的。

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

一个解决方案是使用布尔值或检查过滤器中的反向。像这样:

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