我想检索在多个级别上具有可选元素的数据。例如,假设我有四个祖先-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
。我还没有找到使它快速运行的秘诀。
感谢您的帮助!