SPARQL属性路径,第1部分是唯一的,路径重复之后

时间:2016-03-25 03:09:58

标签: sparql

假设我们有三元组

a1  blah <http://foo.com/f>
a1  pt   c1
c1  pt   d1

如何构建SPARQL查询以选择a1c1d1?我需要能够处理一个blah谓词或多个pt谓词。

所以a1可以成为三重奏的一部分:a1 blah <http://foo.com/f> 但我不知道如何指定它不是a1的情况,但是它的一个对象通过另一个方向的另一个路径连接到a1。但是我还需要使用blah保留路径,因为那是a1或f1通过

连接到对象的

以下是我如何使用它,但它并不漂亮:

select  * from
{
  # other sparql stuff before it
   { ?s blah <http://foo.com/f>
     ?s pt+  <c1>  }
   UNION
   { <c1> blah <http://foo.com/f>  }
}

我可以将'c1'更改为'a1'或'd1',上面的sparql仍然有用

1 个答案:

答案 0 :(得分:3)

AKSW's comment完全正确,您需要使用序列,而不是替代。基于您的示例,听起来您实际上想要通过零或一次出现的&#34; blah&#34;链接到特定对象的主题,然后出现零次或多次&#34; pt&# 34。

如果您想对特定谓词 p q 执行此操作,您可以使用IRI参考指定,那么它只是

?x p?/q* ?y

q 后面的 * 表示零或更多, p 后面的表示零或之一。

但是,如果您事先并不知道具体的IRI,例如,您想要使用变量,请执行以下操作:

?x (?p)?/(?q)* ?y
那么你可能会失去运气。 SPARQL属性路径不支持变量。您可以在属性路径中使用 s |!s 获取通配符,因为每个URI都是 s 或者它不是,但是没有规定将可重复的变量放入属性路径。