给定一个实体列表(包含其中的人员)及其属性,以下查询应如何表现:
select *
where
{
?s ?p ?o.
{
SELECT ?ps WHERE
{
?ps a <http://www.example.org/schema/Person> .
}
limit 1
}
#?ps ?p ?o.
filter (?s =?ps)
}
我在3家三联商店进行了测试。其中两个使用上述查询过滤ps,因此一个人的结果是三倍(+ ps列)。
第3个返回所有数据库三元组,因为“从子选择中投射的变量”ps“不与顶级查询中的任何内容连接。”
仍然因为它被预测出来并且我在FILTER中使用它,我希望应用过滤器。
取消注释行“#?ps?p?o。”确实会显示一个人的三元组。
答案 0 :(得分:3)
将应用过滤器。
FILTER适用于整个区块。结果是“?s?p?o”和结果?ps(所以这是一个交叉产品,此时它是一个交叉产品 - 没有常见的变量 - 但这没关系)。这导致具有4个绑定的解决方案?s?p?o?ps然后应用过滤器。
你可以写:
WHERE {
?s ?p ?o.
{
SELECT ?s
WHERE { ?s a <http://www.example.org/schema/Person> . }
limit 1
}
}