带有可选字段的联合SPARQL查询返回空结果
我正在尝试构建一个可以有多个可选字段的联邦查询。如果任何可选字段没有相应的语句,则该字段的结果值应为空。只是正常的可选行为:) 但是,如果使用下面的代码运行,结果集将为空,即使其他(可选)字段存在相应的语句 如果删除可选的?Pmemberof字段(该字段没有主题语句),一切正常,并返回其他语句,顺便说一下,这也是我对原始查询的预期结果带有可选字段的联合SPARQL查询返回空结果,sparql,optional,dbpedia,wikidata,federated-queries,Sparql,Optional,Dbpedia,Wikidata,Federated Queries,我正在尝试构建一个可以有多个可选字段的联邦查询。如果任何可选字段没有相应的语句,则该字段的结果值应为空。只是正常的可选行为:) 但是,如果使用下面的代码运行,结果集将为空,即使其他(可选)字段存在相应的语句 如果删除可选的?Pmemberof字段(该字段没有主题语句),一切正常,并返回其他语句,顺便说一下,这也是我对原始查询的预期结果 PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX owl: &
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
前缀rdf:
前缀owl:
前缀wdt:
前缀xsd:
前缀rdfs:
前缀foaf:
前缀bif:
选择不同的?wd?标签?描述?出生地?死亡地(组?CONCAT(不同的?职业;分隔符=',')作为?职业)(组?CONCAT(不同的?雇主;分隔符=','))作为?雇主)(组?CONCAT(不同的?成员;分隔符=',')作为?成员)
哪里
{服务
{?dbp rdf:type foaf:Person;
rdfs:标签?l;
猫头鹰:是的。
?l bif:包含“Niki和Lauda”
过滤器strstarts(xsd:string(?wd),”http://www.wikidata.org/entity/")
}
可选的
{?wd?描述;
wdt:P1477?Pbirthname;
wdt:P19?出生地点;
wdt:P20?死亡地点;
wdt:P106?Poccupation;
wdt:P108?聚合物;
wdt:P463?Pmemberof#删除此行->一切正常
}
过滤器(lang(?description)=“en”)
服务维基库:标签
{bd:serviceParam
wikibase:language“[AUTO_language],en”。
?描述
标签?描述。
?Pbirthname rdfs:标签?出生名。
?出生地点
rdfs:标签?出生地点。
?死亡地点
rdfs:标签?死亡地点。
?口袋RDF:标签?职业。
?Pemployer rdfs:标签?雇主。
?rdfs的成员:标签?成员。
?wd rdfs:标签?标签
}
}
分组依据?wd?标签?描述?出生名?出生地?死亡地
限制1000
我做错了什么?我想返回所有其他语句,即使?Pmemberof可能没有相应的语句。可选语句中的所有内容仍然是交叉点,即所有内容都在那里,或者将不返回任何内容。因此,如果某个对象没有成员,那么所有其他数据也不会返回,因为从技术上讲,它是一个包含一些空集的连接。你必须把每一个三重模式放进一个单独的可选条款哦,我真傻!谢谢可选项中的所有内容仍然是交叉点,即,要么所有内容都在那里,要么什么也不返回。因此,如果某个对象没有成员,那么所有其他数据也不会返回,因为从技术上讲,它是一个包含一些空集的连接。你必须把每一个三重模式放进一个单独的可选条款哦,我真傻!谢谢