【问题标题】:"or" in a SPARQL querySPARQL 查询中的“或”
【发布时间】:2015-05-28 08:28:30
【问题描述】:

我不太明白为什么在 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 )
    }

还有其他想法吗?

【问题讨论】:

  • 对不起,当您说第一个查询“不能作为”第二个查询时,您是什么意思?您是否希望这两个查询做完全相同的事情?
  • 如果UNION 的工作方式与逻辑或完全一样,那么这两个查询将产生相同的结果,但当然它们不会。很抱歉我无法正确解释自己,我是 sparql 新手,而且英语不是我的母语,感谢您的理解和时间。
  • @ffa 我想我们在这里切线了,但是您误解了 UNION 在某种程度上不同于逻辑或。然而,它们在语义上是完全相同的。两个查询不同的原因仅仅是范围之一。第一个查询是((?s ?p ?o ?g) AND (?o ?pp ?data1 ?g)) OR ((?s ?p ?o ?g) AND (?o ?pp ?data2 ?g)),第二个查询是(?s ?p ?o ?g) AND ((?o ?pp ?data1 ?g) OR (?o ?pp ?data2 ?g))
  • ...不用担心你的英语,没关系,如果我不明白你说的话,我只是请你解释一下(我希望你也对我这样做):)

标签: sparql linked-data stardog


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 我的意思是你可以在FILTER 条件中使用基本的逻辑运算符only。在我(有限的)经验中,在很多情况下,更全面的实现会很方便。 UNION 语句通常不是一个选项,因为您不能嵌套它。无论如何,感谢您的宝贵贡献。
  • 其实你可以嵌套UNIONs就好了。我很想看看您认为无法使用UNION 表达的析取图形模式 - 如果您有示例,您可以编辑您的问题吗?
  • 是的,但例如 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 一起使用)
  • @JeenBroekstra: 是 |也为对象工作?例如?a :object1|:object2。我实际上已经尝试过,但没有奏效。但我可能做错了什么!!!
  • @msc87,不,属性路径表达式仅适用于属性。对于对象,您必须使用其他构造之一。
【解决方案2】:

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

SELECT DISTINCT ?s ?o1 ?o2 
WHERE {
  {
     ?s p1 ?o1 .
     OPTIONAL
     {
        ?s p2 ?o2 .
     }
  } 
  UNION 
  {
     ?s p2 ?o2 .
     OPTIONAL
     {
        ?s p1 ?o1 .
     }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多