36

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

这个问题的目的是快速参考可以替代“或”陈述的可能方式。

这是我能想到的:

1)UNION

例如:

SELECT * WHERE
{  { ?s :propA ?o } UNION { ?s :propB ?o }  }

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

SELECT * WHERE { 
    { GRAPH ?g {?s ?p ?o. ?o ?pp ?data1}} UNION 
    { GRAPH ?g {?s ?p ?o. ?o ?pp ?data2}}
} 

不作为

SELECT * WHERE { 
    GRAPH ?g {
       ?s ?p ?o. 
       {?o ?pp ?data1} UNION 
       {?o ?pp ?data2} 
    }
 }

(至少不是 Stardog)

2)FILTER

例如:

SELECT * WHERE
    { 
        ?s ?p ?o.
        FILTER (?p = :propA || ?p = :propB )
    }

还有其他想法吗?

4

2 回答 2

49

我不完全确定您为什么说 SPARQL 不提供“基本逻辑运算符”,因为您自己的示例清楚地表明它确实提供:它提供逻辑或 ( ||) 和逻辑与 ( &&) 作为FILTER条件的一部分,并且析取图模式使用UNION(当然,合取图模式不需要特殊语法)。

OR类似构造的其他变体也是可能的。对于“此特定值必须是这些可能性之一”形式的查询,您可以使用集合成员运算符,IN

SELECT * 
WHERE { 
    ?s ?p ?o.
    FILTER (?p IN (:propA, :propB, :propC ) )
}

您还可以将VALUES子句用于这种模式:

SELECT * 
WHERE {
    VALUES ?p { :propA :propB :propC } 
    ?s ?p ?o.
}

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

SELECT * 
WHERE {
    ?s :propA|:propB|:propC ?o.
}
于 2015-05-28T09:37:37.280 回答
5

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

SELECT DISTINCT ?s ?o1 ?o2 
WHERE {
  {
     ?s p1 ?o1 .
     OPTIONAL
     {
        ?s p2 ?o2 .
     }
  } 
  UNION 
  {
     ?s p2 ?o2 .
     OPTIONAL
     {
        ?s p1 ?o1 .
     }
  }
}
于 2017-02-23T22:27:49.707 回答