变量的行为从子选择中投射出来

时间:2014-01-12 13:55:08

标签: sparql

给定一个实体列表(包含其中的人员)及其属性,以下查询应如何表现:

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。”确实会显示一个人的三元组。

1 个答案:

答案 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
  }
}