Sparql 从子选择中投影的变量的行为

Sparql 从子选择中投影的变量的行为,sparql,Sparql,给定一个包含人员及其属性的实体列表,以下查询应如何进行: select * where { ?s ?p ?o. { SELECT ?ps WHERE { ?ps a <http://www.example.org/schema/Person> . } limit 1 } #?ps ?p ?o. filter

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

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'rd one返回所有数据库三元组,因为从子select中投影出来的变量ps不与顶级查询中的任何内容联接

尽管如此,因为它是投影出来的,我在过滤器中使用它,所以我希望应用过滤器


取消注释行?ps?p?o。确实会为一个人显示三个字符。

将应用过滤器

过滤器适用于整个块。有一个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
  }
}

既然已经发布了一个答案,说明应该应用过滤器,那么您可以提供更多关于您测试过的三联存储的详细信息吗?关于代码的问题应该提供足够的信息来重现,虽然不可能共享您的所有数据,但告诉我们您正在测试的三重存储可能有助于了解为什么一个存储会给您不同的结果。也许它不完全支持引入子查询的SPARQL 1.1,而这是观察到不完全支持的地方之一?在试图解决我的另一个问题时,我对Systap bigdata 1.3、stardog 2、brighstardb所有最新版本和支持SPARQL 1.1进行了查询。问题在于bigdata,我提交了一张罚单;它还包含示例数据文件。我知道它可以改进,但我只是从另一个查询中提取了示例查询,所以改进只能在这里应用。