"or" 在 SPARQL 查询中
"or" in a SPARQL query
我不太明白为什么在 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 )
}
还有其他想法吗?
我不完全确定为什么你说 SPARQL 不提供 'the basic logic operators',因为你自己的示例清楚地表明它提供:它提供逻辑或 (||
) 和逻辑- AND (&&
) 作为 FILTER
条件的一部分,以及使用 UNION
的析取图模式(当然,合取图模式不需要特殊语法)。
OR
类构造的其他变体也是可能的。对于 "this particular value must be one of these possibilities" 形式的查询,您可以使用集合成员运算符 IN
:
SELECT *
WHERE {
?s ?p ?o.
FILTER (?p IN (:propA, :propB, :propC ) )
}
您也可以对这种模式使用 VALUES
子句:
SELECT *
WHERE {
VALUES ?p { :propA :propB :propC }
?s ?p ?o.
}
Update忘记了一个,也许是最简单的。对于像您这样的查询,您正在寻找 属性 名称的一些替代方案,您实际上也可以使用 属性 路径表达式,如下所示:
SELECT *
WHERE {
?s :propA|:propB|:propC ?o.
}
如果您想跟踪哪个谓词导致哪个对象,那么这是 "OR" 的通用解决方案:
SELECT DISTINCT ?s ?o1 ?o2
WHERE {
{
?s p1 ?o1 .
OPTIONAL
{
?s p2 ?o2 .
}
}
UNION
{
?s p2 ?o2 .
OPTIONAL
{
?s p1 ?o1 .
}
}
}
我不太明白为什么在 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 )
}
还有其他想法吗?
我不完全确定为什么你说 SPARQL 不提供 'the basic logic operators',因为你自己的示例清楚地表明它提供:它提供逻辑或 (||
) 和逻辑- AND (&&
) 作为 FILTER
条件的一部分,以及使用 UNION
的析取图模式(当然,合取图模式不需要特殊语法)。
OR
类构造的其他变体也是可能的。对于 "this particular value must be one of these possibilities" 形式的查询,您可以使用集合成员运算符 IN
:
SELECT *
WHERE {
?s ?p ?o.
FILTER (?p IN (:propA, :propB, :propC ) )
}
您也可以对这种模式使用 VALUES
子句:
SELECT *
WHERE {
VALUES ?p { :propA :propB :propC }
?s ?p ?o.
}
Update忘记了一个,也许是最简单的。对于像您这样的查询,您正在寻找 属性 名称的一些替代方案,您实际上也可以使用 属性 路径表达式,如下所示:
SELECT *
WHERE {
?s :propA|:propB|:propC ?o.
}
如果您想跟踪哪个谓词导致哪个对象,那么这是 "OR" 的通用解决方案:
SELECT DISTINCT ?s ?o1 ?o2
WHERE {
{
?s p1 ?o1 .
OPTIONAL
{
?s p2 ?o2 .
}
}
UNION
{
?s p2 ?o2 .
OPTIONAL
{
?s p1 ?o1 .
}
}
}