Я пытаюсь создать федеративный запрос, который может иметь несколько необязательных полей. Если какое-либо необязательное поле не имеет соответствующих операторов, результат должен иметь пустое значение в этом поле. Просто нормальное необязательное поведение :)
Но если вы запустите приведенный ниже код с помощью Wikidata Query Service , результирующий набор будет пустым, даже если существуют соответствующие операторы для других (необязательных) полей.
Если вы удалите необязательное поле ? Pmemberof (в котором нет утверждений для субъекта), все работает нормально, и другие операторы возвращаются, что, кстати, также является результатом, который я ожидаю для оригинала запрос.
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX bif: <bif:>
SELECT DISTINCT ?wd ?label ?description ?birthname ?placeofbirth ?placeofdeath (GROUP_CONCAT(DISTINCT ?occupation ; separator=', ') AS ?occupations) (GROUP_CONCAT(DISTINCT ?employer ; separator=', ') AS ?employers) (GROUP_CONCAT(DISTINCT ?memberof ; separator=', ') AS ?memberofs)
WHERE
{ SERVICE <http://dbpedia.org/sparql>
{ ?dbp rdf:type foaf:Person ;
rdfs:label ?l ;
owl:sameAs ?wd .
?l bif:contains "Niki AND Lauda"
FILTER strstarts(xsd:string(?wd), "http://www.wikidata.org/entity/")
}
OPTIONAL
{ ?wd <http://schema.org/description> ?description ;
wdt:P1477 ?Pbirthname ;
wdt:P19 ?Pplaceofbirth ;
wdt:P20 ?Pplaceofdeath ;
wdt:P106 ?Poccupation ;
wdt:P108 ?Pemployer ;
wdt:P463 ?Pmemberof # remove this line -> everything works fine
}
FILTER ( lang(?description) = "en" )
SERVICE wikibase:label
{ bd:serviceParam
wikibase:language "[AUTO_LANGUAGE],en" .
?Pdescription
rdfs:label ?description .
?Pbirthname rdfs:label ?birthname .
?Pplaceofbirth
rdfs:label ?placeofbirth .
?Pplaceofdeath
rdfs:label ?placeofdeath .
?Poccupation rdfs:label ?occupation .
?Pemployer rdfs:label ?employer .
?Pmemberof rdfs:label ?memberof .
?wd rdfs:label ?label
}
}
GROUP BY ?wd ?label ?description ?birthname ?placeofbirth ?placeofdeath
LIMIT 1000
Что я делаю не так? Я хочу вернуть все остальные утверждения, даже если ? Pmemberof может не иметь соответствующих утверждений.