SPARQL查询中的“或”

时间:2015-05-28 08:28:30

标签: sparql linked-data stardog

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

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

这是我能想到的:

1)UNION

e.g:

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

e.g:

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

还有其他想法吗?

1 个答案:

答案 0 :(得分:24)

我不完全确定为什么你说SPARQL没有提供基本的逻辑运算符',因为你自己的例子清楚地表明它确实如此:它提供逻辑OR({ {1}})和逻辑AND(||)作为&&条件的一部分,使用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.
}