SPARQL OR过滤器指令中是否有优先权?

时间:2016-06-30 15:08:05

标签: filter sparql rdf boolean-operations

我想知道单词的顺序是否在OR过滤器SPARQL指令中给出或更改优先级。例如

FILTER( regex(STR(?keywords), "test1", "i")
        || regex(STR(?keywords), "test2", "i")
        || regex(STR(?keywords), "test3", "i")
        || regex(STR(?keywords), "test4", "i")
        || regex(STR(?keywords), "test5", "i") )

此查询是否表明在过滤结果时 test1 的优先级高于 test2 ?换句话说,它是否会影响结果的顺序?如果我将结果限制为20,例如低于总数(让我们说60),我会先得到 test1 的结果然后 test2 < / em>的

如果没有,有没有办法确定这样的优先权?

1 个答案:

答案 0 :(得分:7)

  

此查询是否表明test1的优先级高于test2   过滤结果?换句话说,它是否会影响订单   结果?在我将结果限制为20的情况下   这个例子低于总数(让我们说60),我会得到的   首先测试1的结果然后测试2?

如果在查询结尾处没有订单,则未指定订单,因此实施肯定会根据过滤器,但它似乎不太可能,至少不是以任何明显的方式。当你问,&#34;我会先得到test1的结果,然后是test2,&#34;它表明对过滤器的作用有点误解。 过滤器是一种指定结果必须满足的一些条件才能包含在结果集中的方法。从概念上讲,在过滤器之前,工作结果集中有一个结果列表,然后过滤器测试应用于每个测试,以及满足测试的测试被存管。没有&#34;结果&#34; test1或test2在任何有意义的意义上。应用测试的不同方式可能影响排序,例如,取决于其是否:

final results = {}
for (result in working results) 
  for (testi in tests)
    if result passes test
      add result to final results

final results = {}
for (testi in tests)
  for (result in working results) 
    if result passes test
      add result to final results

由于最终结果是,您最终会得到相同的集合,但由于结果最终是作为列表提供的,因此可以想象这可能会影响你看到结果的顺序。但正如我上面所说,你不可能以这种方式得到任何可靠的,有意义的差异。

  

如果没有,有没有办法确定这样的优先权?

如果您想以某种方式订购结果,您需要弄清楚如何获得优先级,然后您可以按顺序排序。例如,在您的情况下,您可以执行以下操作:

select ?keywords {
  values ?test { "test1" "test2" "test3" }
  #-- get a binding for ?keywords...
  filter regex(str(?keywords), ?test)
}
order by ?test

在这种情况下,由于?test 的值具有可靠的排序,您可以根据匹配的?test 的值来排序结果。当然,如果?关键字匹配?test 的多个值,您会在结果中多次看到它。

如果条件不像字符串那么简单,您仍然可以使用来指定优先级:

select ?keywords {
  values (?test ?priority) { ("test1" 3) ("test2" 0) ("test3" 5)}
  #-- get a binding for ?keywords...
  filter regex(str(?keywords), ?test)
}
order by ?priority