Sparql:如何检索相同属性的任意数量的值?

时间:2017-05-18 08:04:26

标签: sparql

如果一个主题多次出现相同的属性,是否可以检索它们指向的所有对象/值,而不事先指定它们的数字?

这个问题类似于one

示例数据(取自上面的链接):

@prefix example: <http://example.org/> .
example:subject1 example:property example:object1 .
example:subject1 example:property example:object2 .
example:subject1 example:property example:object3 .
...

可以通过以下方式获得定义数量的对象:

select ?subject ?object1/2/n 
where {?subject example:property ?object1, ?object2 .}
filter( ?object1 != ?object2 ).

但是,如果我们事先不知道物业的发生次数怎么办? (除了编程)。谢谢。

1 个答案:

答案 0 :(得分:0)

我想,你对Turtle syntax感到有些困惑。

事实上,

SELECT ?object1
   WHERE {
   ?subject example:property ?object1, ?object2 .
   FILTER ( ?object1 != ?object2 ).
   }

只是一个语法糖:

SELECT ?object1
   WHERE {
   ?subject example:property ?object1 .
   ?subject example:property ?object2 .
   FILTER ( ?object1 != ?object2 ).
   }

此模式匹配所有三元组,这三元组仅通过其对象彼此不同 我想,“一个多次出现相同属性的主题”(来自你的问题)意味着“同一主题和同一属性存在不同的对象”。

模式是对称的,即如果:object1在结果中绑定到?object1,则:object1将绑定到另一个结果中的?object2。对于此模式,是否存在具有不同对象:object3的任何第三个三元组无关紧要,但如果存在,则:object3将在另一个结果中绑定到?object1

你可以尝试这样的事情来更好地理解:

SELECT DISTINCT ?object1
   WHERE {
   ?subject example:property ?object1 .
   FILTER EXISTS {
      ?subject example:property ?object2 .
      FILTER ( ?object1 != ?object2 )
      }
   }