Объединенный запрос SPARQL с необязательными полями возвращает пустой результат - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь создать федеративный запрос, который может иметь несколько необязательных полей. Если какое-либо необязательное поле не имеет соответствующих операторов, результат должен иметь пустое значение в этом поле. Просто нормальное необязательное поведение :) Но если вы запустите приведенный ниже код с помощью 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 может не иметь соответствующих утверждений.

...