如何在SPARQL中有效设计嵌套的可选子句

时间:2018-07-13 19:19:42

标签: sparql optional

我想检索在多个级别上具有可选元素的数据。例如,假设我有四个祖先-Fred,Sam,George和Mark。弗雷德(Fred)和山姆(Sam)有孩子,乔治(George)和马克(Mark)没有。弗雷德的所有孩子都有昵称,但山姆的四个孩子中有两个没有昵称。

我想查询祖先的所有孩子,并返回他们的姓名,年龄和昵称。

这似乎可行:

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子句

OPTIONAL { ?child  foo:nickname ?childNickname  }

...做叉积...将每个?child与每个?childNickname组合在一起,然后返回正确的值。

我该如何编写此SPARQL SELECT以使其高效运行(不做叉积运算)并返回所有祖先和所有孩子,即使孩子没有昵称也是如此?我已经尝试过FILTERS。我尝试检查?child是否为BOUND。我还没有找到使它快速运行的秘诀。

感谢您的帮助!

0 个答案:

没有答案