假设我们有三元组
a1 blah <http://foo.com/f>
a1 pt c1
c1 pt d1
如何构建SPARQL查询以选择a1
或c1
或d1
?我需要能够处理一个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仍然有用
答案 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 或者它不是,但是没有规定将可重复的变量放入属性路径。