Как правильно использовать SPARQL OPTIONAL для извлечения атрибутов для ресурса, который может существовать?
Я пытаюсь использовать запрос SPARQL для получения информации о ресурсе DBpedia (Person). Я хотел бы использовать один и тот же запрос для извлечения данных о любом Человеке, параметризируя URI ресурса. Поскольку некоторые атрибуты могут не существовать для определенного ресурса, я использую инструкцию OPTIONAL. Вот мой запрос:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?label ?abstract ?placeOfBirth
?birthPlace ?birthDate ?deathDate ?page ?thumbnail
WHERE {
<http://dbpedia.org/resource/Neil_Simon> rdfs:label ?label ;
dbo:abstract ?abstract ;
foaf:page ?page .
OPTIONAL {
<http://dbpedia.org/resource/Neil_Simon> dbpprop:placeOfBirth ?placeOfBirth ;
dbpprop:birthPlace ?birthPlace ;
dbo:birthDate ?birthDate ;
dbo:deathdate ?deathDate ;
dbo:thumbnail ?thumbnail .
}
FILTER (LANG(?label) = 'en')
FILTER (LANG(?abstract) = 'en')
}
LIMIT 1
Я оставил все, кроме метки, abstract и page в OPTIONAL, поскольку, если я использую один и тот же запрос для другого человека, у них могут не быть этих свойств. Проблема в том, что ни один из этих необязательных атрибутов не отображается в результатах. В случае с Нилом Саймоном вы можете видеть, что существуют значения для даты рождения, рождения и эскиза: http://dbpedia.org/resource/Neil_Simon. Однако эти значения не отображаются, когда я запускаю запрос: DBpedia SPARQL query. Что я делаю неправильно, и как я могу получить эти свойства?
Ответы
Ответ 1
Хотя вы использовали опциональную конструкцию, для самого шаблона карты нужны все атрибуты внутри для соответствия. Таким образом, только если у вас есть место рождения, дата рождения, смерти и эскиз, внутренняя дополнительная конструкция удовлетворена
Я бы предложил разбить необязательную конструкцию на несколько необязательных конструкций.