Я пытаюсь определить три самых длинных подстроки из строки, используя SPARQL и Wikidata Query Service, а затем ранжировать
- подстроки в строке длиной
- строки по длине любой из этих самых длинных подстрок.
Мне удалось определить первую и вторую подстроку из строки, и, конечно, я мог просто создать аналогичные дополнительные строки для решения проблемы, но это кажется уродливым и неэффективным, поэтому мне интересно, если кто-нибудь здесь знает о лучшем способе получить есть.
Это упрощенная версия кода, хотя я оставил некоторые вспомогательные переменные, которые я использую для отслеживания прогресса в пути. Вы можете попробовать это здесь .
Разъяснение в ответ на этот комментарий : если необходимо обработать этот запрос как подзапрос и передать ему результаты из другого подзапроса, это нормально для меня. Чтобы получить представление о видах использования, которые я имею в виду, см. эту демонстрацию .
SELECT * WHERE {
{
VALUES (?title) {
("What are the longest three words in this string?")
("A really complicated title")
("OneWordTitleInCamelCase")
("Thanks for your help!")
}
}
BIND(STRLEN(REPLACE(?title, " ", "")) AS ?titlelength)
BIND(STRBEFORE(?title, " ") AS ?substring1)
BIND(STRLEN(REPLACE(?substring1, " ", "")) AS ?substring1length)
BIND(STRAFTER(?title, " ") AS ?postfix)
BIND(STRLEN(REPLACE(?postfix, " ", "")) AS ?postfixlength)
BIND(STRBEFORE(?postfix, " ") AS ?substring2)
BIND(STRLEN(REPLACE(?substring2, " ", "")) AS ?substring2length)
}
ORDER BY DESC(?substring1length)
Ожидаемые результаты:
longsubstring substringlength
OneWordTitleInCamelCase 23
complicated 11
longest 7
really 6
string 6
Thanks 6
title 5
three 5
your 4
help 4
Фактические результаты:
title titlelength substring1 substring1length postfix postfixlength substring2 substring2length
Thanks for your help! 18 Thanks 6 for your help! 12 for 3
What are the longest three words in this string? 40 What 4 are the longest three words in this string? 36 are 3
A really complicated title 23 A 1 really complicated title 22 really 6
OneWordTitleInCamelCase 23 0 0 0