如何在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  }
。。。一个叉积。。。将每个
?孩子
与每个
?孩子昵称
组合在一起。。。然后返回正确的值

我如何编写这个SPARQL
SELECT
,以便高效地运行(而不是做叉积)并返回所有祖先和所有孩子,即使孩子没有昵称?我尝试了
过滤器
。我已经试着检查
?child
是否绑定了
。我还没有找到让它跑得快的秘诀


谢谢你的帮助

可选的是左外连接。评估是自下而上的。我看不到任何优化潜力,这必须由triple Store来完成可能需要尝试的一件事是使用
VALUES
子句,而不是
中的
FILTER…来对令牌进行优化。但正如@AKSW所说,这取决于您使用的triplestore(以及它的查询计划器有多聪明)这是否会有任何影响。啊,对。内联数据可能确实有帮助。