Есть ли приоритет в инструкции фильтра SPARQL ИЛИ?

Я хотел бы знать, дает ли порядок слов или изменяет приоритет в инструкции 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?

Если нет, то есть ли способ установить такой приоритет?


person M20    schedule 30.06.2016    source источник
comment
К чему приведет более высокий приоритет? Аргументы фильтра никак не изменяют данные, поэтому их порядок не повлияет на результат (хотя, возможно, на производительность).   -  person Sirko    schedule 30.06.2016
comment
@Sirko извините, мой вопрос не был полным, я обновлю его. Я забыл добавить, что я ограничиваю результаты до 20, например. в случае, если их больше 20, получу ли я сначала результаты test1?   -  person M20    schedule 30.06.2016
comment
Я не думаю, что в стандарте есть что-то, чтобы указать это. Если вы хотите дать приоритет некоторым записям, вы должны использовать предложение ORDER.   -  person Sirko    schedule 30.06.2016


Ответы (1)


Указывает ли этот запрос, что test1 имеет более высокий приоритет, чем test2 при фильтрации результатов? другими словами, влияет ли это на порядок результатов? в случае, когда я ограничиваю результаты до 20, например, что меньше, чем общее количество (скажем, 60), получу ли я сначала результаты test1, а затем test2?

Когда в конце запроса нет порядка по, порядок не указан, поэтому реализация, безусловно, может изменить порядок на основе фильтра, но это не так. кажутся особенно вероятными, по крайней мере, не очевидным образом. Когда вы спрашиваете: «Сначала я получу результаты test1, а затем test2», это наводит на мысль о некотором непонимании того, что делает filter. Фильтр – это способ указания некоторых условий, которым должен удовлетворять результат, чтобы быть включенным в набор результатов. Концептуально, перед фильтром находится список результатов в рабочем наборе результатов, а затем к каждому применяется тест фильтр, и те, которые удовлетворяют тесту хранятся. Нет никаких «результатов» test1 или test2 в каком-либо осмысленном смысле. Различные способы применения теста могут повлиять на порядок, например, в зависимости от того, является ли он:

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

or

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. Конечно, если ?keywords соответствует более чем одному значению ?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
person Joshua Taylor    schedule 30.06.2016