SPARQL查询中的"或"

ffa*_*ffa 16 sparql stardog linked-data

我不太明白为什么在SPARQL中他们没有实现基本的逻辑运算符.然而,在大多数情况下,可以以多种方式获得相同的结果.

这个问题的目的是快速参考可以用"或"语句替代的低谷.

这是我能想到的:

1)UNION

例如:

SELECT * WHERE
{  { ?s :propA ?o } UNION { ?s :propB ?o }  }
Run Code Online (Sandbox Code Playgroud)

- 通常不合适,因为它可能变得非常冗长,因为

SELECT * WHERE { 
    { GRAPH ?g {?s ?p ?o. ?o ?pp ?data1}} UNION 
    { GRAPH ?g {?s ?p ?o. ?o ?pp ?data2}}
} 
Run Code Online (Sandbox Code Playgroud)

不起作用

SELECT * WHERE { 
    GRAPH ?g {
       ?s ?p ?o. 
       {?o ?pp ?data1} UNION 
       {?o ?pp ?data2} 
    }
 }
Run Code Online (Sandbox Code Playgroud)

(至少没有Stardog)

2)FILTER

例如:

SELECT * WHERE
    { 
        ?s ?p ?o.
        FILTER (?p = :propA || ?p = :propB )
    }
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?

Jee*_*tra 27

我不完全确定为什么你说SPARQL不提供'基本逻辑运算符',因为你自己的例子清楚地表明它确实:它提供逻辑-OR(||)和逻辑-AND(&&)作为FILTER条件的一部分,并且使用析取图模式UNION(当然,连接图模式不需要特殊语法).

类似OR构建体的其他变体也是可能的.对于"此特定值必须是这些可能性之一"形式的查询,您可以使用set membership运算符IN:

SELECT * 
WHERE { 
    ?s ?p ?o.
    FILTER (?p IN (:propA, :propB, :propC ) )
}
Run Code Online (Sandbox Code Playgroud)

您还可以将此VALUES子句用于此类模式:

SELECT * 
WHERE {
    VALUES ?p { :propA :propB :propC } 
    ?s ?p ?o.
}
Run Code Online (Sandbox Code Playgroud)

更新我忘了一个,也许是最简单的.对于像你这样的查询,你正在寻找一些属性名称的替代品,你也可以实际使用属性路径表达式,如下所示:

SELECT * 
WHERE {
    ?s :propA|:propB|:propC ?o.
}
Run Code Online (Sandbox Code Playgroud)

  • @msc87,不,属性路径表达式仅适用于属性。对于对象,您将不得不使用其他结构之一。 (3认同)
  • @JeenBroekstra:确实| 也为该对象工作吗?例如?aa:对象1|:对象2。我实际上已经尝试过了,但没有成功。但我可能做错了什么! (2认同)

小智 6

如果您想跟踪哪个谓词导致哪个对象,那么这是“OR”的通用解决方案:

SELECT DISTINCT ?s ?o1 ?o2 
WHERE {
  {
     ?s p1 ?o1 .
     OPTIONAL
     {
        ?s p2 ?o2 .
     }
  } 
  UNION 
  {
     ?s p2 ?o2 .
     OPTIONAL
     {
        ?s p1 ?o1 .
     }
  }
}
Run Code Online (Sandbox Code Playgroud)