如何在SPARQL中高效地设计嵌套的可选子句
我想检索在多个级别具有可选元素的数据。例如,假设我有四个祖先——弗雷德、萨姆、乔治和马克。弗雷德和山姆有孩子。。。乔治和马克没有。弗雷德所有的孩子都有绰号,但萨姆的四个孩子中有两个没有 我想询问我祖先的所有孩子,并返回他们的姓名、年龄和昵称 这似乎是可行的:如何在SPARQL中高效地设计嵌套的可选子句,sparql,optional,Sparql,Optional,我想检索在多个级别具有可选元素的数据。例如,假设我有四个祖先——弗雷德、萨姆、乔治和马克。弗雷德和山姆有孩子。。。乔治和马克没有。弗雷德所有的孩子都有绰号,但萨姆的四个孩子中有两个没有 我想询问我祖先的所有孩子,并返回他们的姓名、年龄和昵称 这似乎是可行的: SELECT DISTINCT ?token ?ancestorName ?childName ?childAge ?childNickname WHERE { FILTER ( ?token IN ("Fred","Sa
SELECT DISTINCT ?token ?ancestorName ?childName ?childAge ?childNickname
WHERE
{
FILTER ( ?token IN ("Fred","Sam","George","Mark") )
?ancestor foo:name ?token .
?ancestor foo:fullname ?ancestorName .
OPTIONAL
{
?ancestor foo:parentOf ?child .
?child foo:fullname ?childName .
?child foo:age ?childAge .
OPTIONAL { ?child foo:nickname ?childNickname }
}
}
如果一个祖先没有孩子,一切似乎都很好。。。所有外部可选子句都会快速返回
没有数据。如果祖先有子代,并且每个子代都有一个昵称,那么它将快速返回并填充数据。当祖先有了孩子,但孩子没有昵称时,问题似乎就出现了
它是有效的。。。但这需要很长时间(我有很多数据)。似乎内部的可选
子句
OPTIONAL { ?child foo:nickname ?childNickname }
。。。一个叉积。。。将每个?孩子
与每个?孩子昵称
组合在一起。。。然后返回正确的值
我如何编写这个SPARQLSELECT
,以便高效地运行(而不是做叉积)并返回所有祖先和所有孩子,即使孩子没有昵称?我尝试了过滤器
。我已经试着检查?child
是否绑定了
。我还没有找到让它跑得快的秘诀
谢谢你的帮助 可选的是左外连接。评估是自下而上的。我看不到任何优化潜力,这必须由triple Store来完成可能需要尝试的一件事是使用
VALUES
子句,而不是中的FILTER…来对令牌进行优化。但正如@AKSW所说,这取决于您使用的triplestore(以及它的查询计划器有多聪明)这是否会有任何影响。啊,对。内联数据可能确实有帮助。