Есть ли лучший способ выполнять запросы без учета регистра?

Я ищу способ сопоставить значения утверждений без учета регистра.

Например, в Викиданных есть следующее утверждение:

wd:Q1524522 wdt:P2002 'bouletcorp'

но, следуя случай, используемому в Twitter, предположим, что вместо этого я буду использовать значение Bouletcorp, что даст следующий запрос и не может найти ни одного соответствующего объекта:

SELECT ?item WHERE {
  ?item wdt:P2002 "Bouletcorp" .
}

(попробуйте)

Решением может быть использование регулярного выражения с нечувствительным к регистру флагом следующим образом:

SELECT ?item WHERE {
  ?item wdt:P2002 ?twittername .
  FILTER (regex(?twittername, "Bouletcorp", "i"))
}

(попробуйте)

но насколько менее эффективным будет этот запрос? Разве нет лучшего способа? Насколько я понимаю, этот запрос заставит движок SPARQL передавать все триплеты, имеющие значение запрошенного свойства, через регулярное выражение, что звучит неэффективно. Это еще не так медленно для P2002, но я предполагаю, что некоторые свойства, имеющие более миллиона совпадающих утверждений, могут быть проблематично, нет?


person maxlath    schedule 28.03.2017    source источник
comment
В стандарте SPARQL нет ничего лучше. Конечно, REGEX будет использовать сканирование + применение регулярного выражения ко всем значениям, что может быть медленным. В зависимости от тройного хранилища могут быть некоторые встроенные функции, соответственно. расширение для полнотекстового поиска. Насколько мне известно, Викиданные размещены в тройном хранилище Blazegraph, так что вы можете ознакомиться с документацией.   -  person UninformedUser    schedule 28.03.2017
comment
Он не избегает касания в каждом тройном случае, но вы можете сделать ?s ?p ?v filter (lcase(?v) = 'the string'), что не потребует введения полного сравнения регулярных выражений. Кроме того, вам не придется беспокоиться о том, содержит ли искомая строка символы, чувствительные к регулярным выражениям.   -  person Joshua Taylor    schedule 29.03.2017