Включите диапазон «возможных» дат в фильтр SPARQL - PullRequest
0 голосов
/ 17 февраля 2019

Я работаю над проектом DBPedia, чтобы найти певиц, которые были бы активны в течение 1960-х (приблизительно).

К сожалению, когда я пытаюсь выбрать диапазон певцов, которые были активны с 1955 по 1972, я упускаю певцов, которые были активны до 1955 года (результаты сводят на нет некоторых певцов, например, Умм Кульсум, который был активен с 1925-1973).

Мой код указан ниже и показывает, где фильтр включает только артистов, которые были активны исключительно в этом диапазоне дат.Я хочу создать фильтр, который говорит: «Дайте мне всех певцов, которые были бы музыкально активны, в частности, в этом диапазоне дат, но также включали тех, кто мог быть активен с периода до и включая этой даты».спектр"?Я не хочу, чтобы те, которые были активны только до этого диапазона дат.

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 голосов
/ 25 февраля 2019

Одним из решений является также проверка обратного в вашем фильтре с использованием логического или.Как это:

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
...