Help:Выборка страниц
Одной из важнейших составляющих семантического поиска в Semantic MediaWiki является формат структурированных запросов, позволяющих отбирать страницы по ряду критериев. С помощью категорий, семантических свойств пользователи вики добавляют на страницы структурированную информацию, а затем эти данные становятся доступными для поиска с помощью специального языка запросов. Итак, в этой главе мы расскажем о том, как строить правильные посковые запросы в SMW.
Contents
- 1 Категории и значения свойств
- 2 Запросы расстояния
- 3 Значения свойств: шаблоны и компараторы
- 4 Объединение результатов запросов: дизъюнкция
- 5 Описание отдельных страниц
- 6 Ограничение результатов пространством имён
- 7 Подзапросы и цепочки свойств
- 8 Использование шаблонов и переменных
- 9 Сортировка результатов
- 10 Ссылки на результаты семантического поиска
- 11 Вещи, которые невозможны
Категории и значения свойств[edit]
Когда мы приводили простой пример семантического поиска, мы задали единственное условие [[Находится в::Германия]] для того, чтобы описать, какие именно страницы нам нужны. Вы должны были обратить внимание, что при запросе в SMW мы использовали в точности тот же текст, как при описании страницы. Это общая схема: когда мы хотим пометить страницу как объект, находящийся в германии, мы пишем на ней [[Находится в::Германия]]; если мы хотим спросить у вики все объекты, которые находятся в Германии, в теле запроса мы пишем то же самое: [[Находится в::Германия]]. Синтаксис для запроса страниц, которые удовлетворяют некоторому условию, в точности такой же, как синтаксис для явного утверждения, что это условие выполняется.
Следующие запросы должны проиллюстрировать этот принцип:
- [[Категория:Актёр]] выдаёт все страницы, прямо или косвенно (через под-, подпод- и т.д. категории) содержащиеся в этой категории.
- [[Родиться в::Бостон]] выдаёт все страницы, аннотированные тем, что кто-то родился в Бостоне.
- [[Рост::180 см]] выдаёт все страницы, аннотированные тем, что кто-то имеет рост 180 см.
Используя другие категории или свойства, а не только вышеприведенные, мы уже можем запросить страницы, которые имеют определенные аннотации. Далее давайте скомбинируем эти требования:
[[Категория:Актёр]] [[Родиться в::Бостон]] [[Рост::180 см]]
запросит всех, кто является актёром, и родился в Бостоне, и имеет рост 180 см. Другими словами, когда много условий указано в одном запросе, результат сужается до тех страниц, которые удовлетворяют всем требованиям. Таким образом, у нас есть логическое И. Кстати, запросы также могут включать разрывы строк для того, чтобы сделать их более удобочитаемыми. Поэтому мы можем также написать:
[[Категория:Актёр]] [[Родиться в::Бостон]] [[Рост::180 см]]
для получения того же результата, что и выше. Заметим, что запросы выдают только те статьи, про которые в точности известно, что они удовлетворяют требуемым свойствам: если нет свойства Рост для некоторого актёра, то он не будет выбран.
При определении значений свойств SMW обычной игнорирует любые начальные и конечные пробельные символы, поэтому два условия [[Рост::180 см]] и [[Рост:: 180 см ]] имеют одно и то же значение. Типы данных, такие как число, могут иметь дополнительные свойства, такие как игнорирование запятых (или точек), которые могут использоваться для отделения разряда тысяч (зависит от региональных настроек). Также SMW трактует синонимичные имена страниц таким же образом, как и MediaWiki обычно считает Semantic wiki, Semantic_wiki, и semantic wiki ссылками на одну и ту же страницу.
Если вы часто используете определенные наборы условий, вы можете создать Концепт в качестве сокращения. Концепты представляют собой некоторого рода виртуальные категории и могут, таким образом, использоваться в условиях подобно категориям.
Запросы расстояния[edit]
Для поиска всех страниц со значением типа географические координаты в пределах определенного расстояния от заданного места можно использовать специальный синтаксис, если установлено расширение Maps (formerly Semantic Maps) — смотрите страницу запрос расстояния в документации Semantic Maps для детальной информации.
Значения свойств: шаблоны и компараторы[edit]
В вышеприведенном примере мы задавали очень конкретные условия на свойства, используя «Бостон» and «180 см» в качестве значений. Во многих случаях ищут не отдельные значения, а целый диапазон, например "все актёры, которые выше, чем 180 см". В некоторых случаях могут даже искать все страницы, которые имеют вовсе произвольные значения для заданного свойства. Например, умершие люди могут теми, кто имеют значение для свойства «дата смерти». Подобные общие условия возможны с помощью компараторов и шаблонов.
- Шаблоны записываются как "+" и допускают произвольное значение для заданного условия. Например, [[Родиться в::+]] выдаст все страницы, которые имеют какое-нибудь значение для свойства «Родиться в».
- Компараторы — это специальные символы, подобные < или >. Они помещаются после :: в условиях на свойства. SMW поддерживает следующие компараторы начиная с версии 1.5.3:
- >> и <<: "больше" и "меньше";
- > и <: "больше или равно" и "меньше или равно" по-умолчанию, но "больше" и "меньше", если
$smwStrictComparators = true;
; - ≥ и ≤: "больше или равно" и "меньше или равно";
- !: "не" ("не равно");
- ~: сравнение «похожести» для строк;
- !~: сравнение «непохожести» для строк.
Компараторы работают только для значений свойств, но не для условий на категории. Установленная вики может ограничивать то, какие компараторы доступны, что выполняется администратором модификацией значения $smwgQComparators как это объяснено в разделе Help:Конфигурация.
В зависимости от значения $smwStrictComparators интерпретация > и < может различаться; различное поведение документировано на странице о строгих компараторах.
При применении компараторов к страницам используются заголовки страниц (без префикса пространства имён). Однако это можно изменить установкой другого ключа сортировки MediaWiki для этих страниц, например, {{DEFAULTSORTKEY: пользовательский ключ}}. Пожалуйста, заметьте, что это применяется ко всем компараторам, включая ! и ~. Невозможно иметь несколько ключей сортировки для одной страницы. В частности, страницы перенаправления не принимаются во внимание при применении компараторов.
Не равно[edit]
Вы можете выбрать страницы, которые имеют значение свойства неравное заданному значению. Например,
[[Телефонный код::!415]]
выберет все страницы, которые имеют телефонный код отличный от «415». Заметим, что это описание запроса, не ищущего страницы, которые не имеют телефонного кода 415. Правильнее сказать, он ищет все страницы, которые также имеют код, но неравный 415. В частности, страницы, которые не имеют телефонного кода вообще, не могут быть результатом вышеприведенного запроса.
Как и в случае с компаратором равенства (стандартным), использование пользовательских единиц измерения может потребовать округления в числовых преобразованиях, что может привести к неожиданным результатам. Например, [[Рост::!6.00 футов]] может все-таки выбирать кого-нибудь, чей рост отображается как «6.00 футов», просто потому что точное числовое значение в действительности не 6. В подобных ситуациях будет более полезно запрашивать страницы, которые имеют значение свойства за пределами определенного диапазона, выражаемого дизъюнкцией (см. ниже) от условий с < и >.
Больше или равно, меньше или равно[edit]
Для числовых значений часто хочется выбирать страницы со значениями свойства в определенном диапазоне. Например,
[[Категория:Актёр]] [[Рост::>6 футов]] [[Рост::<7 футов]]
запросит всех актёров, чей рост от 6 до 7 футов. Заметим, что при этом используется преимущество автоматического преобразования единиц измерения: даже если рост актёра был задан как [[Рост::195 см]], он будет распознан как правильный ответ (при условии, что тип данных для роста «понимает» обе единицы измерения, см. Help:Пользовательские единицы измерения). Заметим, что этот компаратор означает больше/меньше или равно — символ равенства = не требуется.
Такие диапазонные условия на значения свойств наиболее актуальны, если значения могут быть упорядочены естественным образом. Например, имеет смысл запросить [[дата начала::>6 Мая 2006]], но довольно бесполезно писать [[URL домашней страницы::>http://www.somewhere.org]].
Если тип данных не имеет естественного линейного порядка, Semantic MediaWiki будет просто применять алфавитный порядок для нормализованных значений данных, как они используются в экспорте RDF. Вы можете, следовательно, использовать больше и меньше для выбора алфавитных диапазонов строкового свойства. Например, вы можете запросить [[Фамилия::>До]] [[Фамилия::<Ж]] для выбора фамилий от «До» до «Ж». Для вики-страниц компаратор ссылается на имя данной страницы (без префикса пространства имён).
Здесь и во всех других использованиях компараторов может случиться, что значение для поиска в действительности начинается с символа, подобного <. В этом случае можно предотвратить интерпретацию символа SMW как компаратора, если вставить пробел после ::. Например, [[Свойство:: <br>]] на самом деле ищет все страницы со значением «<br>» для данного свойства.
Больше, меньше[edit]
Иногда нужно исключить само точное значение из результата, например, чтобы найти актёра выше, чем Хью Лори (1,89 м), можно использовать в запросе комбинацию из компаратора > и компаратора !:
[[Категория:Актёр]] [[Рост::>1.89 м]] [[Рост::!1.89 м]]
Похожесть[edit]
Компаратор ~ работает только для свойств типа Строка. В условии похожести используются шаблоны '*' для обозначения произвольной последовательности символов и '?' для обозначения произвольного одиночного символа. Например, можно запросить "[[Адрес::~*Park Place*]]" для выбора адресов, содержащих строку «Park Place», или "[[Обращение::~M?.]]" для выбора и «Mr.», и «Ms.».
Строгие компараторы[edit]
Стандартное поведение SMW для компараторов < и >, означающих "меньше или равно" и "больше или равно", может быть несколько сбивающим с толку для людей, которые знакомы с математическими значениями < и >. Поэтому вы можете заставить SMW интерпретировать < и > "строго", как это объяснено здесь.
Объединение результатов запросов: дизъюнкция[edit]
Дизъюнкция — это условие ИЛИ, которое допускает несколько альтернативных условий на результаты запроса. SMW имеет два способа написания дизъюнкции в запросах:
- Оператор OR используется для объединения двух запросов.
- Оператор || используется для дизъюнкции значений, имён страниц и категорий.
В любом случае, дизъюнкция требует, чтобы по крайне мере одна (но может быть больше, чем одна) из возможных альтернатив была удовлетворена (логическое ИЛИ). Например, запрос
[[Родиться в::Бостон]] OR [[Родиться в::Нью-Йорк]]
описывает все страницы о людях, родившихся в Бостоне или Нью-Йорке. Это также может быть записано с помощью || как [[Родиться в::Бостон||Нью-Йорк]]. В последнем случае «Бостон||Нью-Йорк» описывает значение, которое может быть любым из двух альтернатив. Написание запросов с помощью || обычно короче, но не все дизъюнкции могут быть записаны этим способом. Следующий запрос — пример того, что не может быть выражено с помощью ||:
[[Родиться в::Бостон]] OR [[Категория:Актёр]]
Синтаксис || может быть использован не только для значений свойств, но также для категорий, как в запросе
[[Категория:Актёр мюзикла||Актёр театра]]
Описание отдельных страниц[edit]
До сих пор все условия зависели от тех или иных аннотаций, указанных на странице. Но существуют также условия для непосредственного выбора каких-то страниц или страниц из заданного пространства имён.
Непосредственное указание заголовка некоторой страницы (возможно, включая префикс пространства имён) или списка заголовков таких страниц, разделённых ||, выбирает страницы с этими именами. Пример — это запрос
[[Бразилия||Франция||Пользователь:Джон Доу]]
который имеет три результата (по крайней мере, если эти страницы существуют). Отметим, что результат не отображает никаких префиксов пространства имён; для определения пространства имён смотрите всплывающую подсказку или статусную строку браузера или пройдите по ссылке. Ограничив множество, основываясь на значениях атрибутов, можно спросить, например, «Билл Мюррей, Дэн Эйкройд, Гарольд Рамис и Эрни Хадсон — кто из них выше 6 футов?». Но непосредственный выбор статей более полезен, если в дальнейшем запрашиваются свойства этих статей, например, просто напечатать рост Билла Мюррея.
Для выбора категории таким способом нужно поместить : перед её именем. Это предотвращает смешивание [[Категория:Актёр]] (выдать всех актёров) и [[:Категория:Актёр]] (выдать категорию «Актёр»).
Ограничение результатов пространством имён[edit]
Менее конкретный способ выбора заданных страниц — через пространства имён. По-умолчанию, выдаются страницы во всех пространствах имён. Для выдачи страниц в определенном пространстве имён оно задаётся с помощью «шаблона», например, пишется [[Help:+]] для выдачи всех страниц в пространстве имён «Help». Так как основное пространство имён обычно не имеет префикса, пишут [[:+]] для выбора страниц только в основном пространстве имён.
Дизъюнкция также работает с синтаксисом ||, как и выше. Например, для выдачи страниц или в основном пространстве имён, или в «User» пишут [[:+||User:+]]. Для выдачи страниц в пространстве имён «Категория» опять необходимо поставить : перед названием пространства имён для предотвращения смешивания, например, [[:Категория:+]].
Подзапросы и цепочки свойств[edit]
Перечисление множества страниц для свойства обременительно и сложно для поддержания. Например, для выбора всех актёров, которые родились в итальянском городе, можно написать:
[[Категория:Актёр]] [[Родиться в::Рим||Милан||Турин||Флоренция||...]]
Для генерации списка всех этих итальянских городов можно сделать ещё один запрос
[[Категория:Город]] [[Расположен в::Италия]]
а затем скопировать и вставить результаты в первый запрос. Что бы хотелось сделать, так это использовать запрос городов как подзапрос в запросе актёров для получения желаемого результата напрямую. Вместо фиксированного списка имён страниц для значения свойства новый запрос, заключенный в <q> и </q>, вставляется в условие свойства. В этом примере можно написать так:
[[Категория:Актёр]] [[Родиться в::<q>[[Категория:Город]] [[Расположен в::Италия]]</q>]]
Возможны произвольные уровни вложенности, хотя вложенность должна быть ограничена для отдельных сайтов для обеспечения производительности. В ещё одном примере для выбора всех городов Европейского союза можно написать:
[[Категория:Город]] [[Расположен в::<q>[[Является членом::Европейский союз]]</q>]]
В примере выше мы по существу сконструировали цепочку свойств «Расположен в» и «Является членом» для поиска сущностей, которые расположены в чём-то, являющемся членом ЕС. Запросы могут быть написаны в более краткой форме для этого распространенного случая:
[[Категория:Города]] [[Расположен в.Является членом::Европейский союз]]
Этот запрос имеет то же самое значение, что и выше, но требуется гораздо меньше специальных символов. В общем, цепочки свойств создаются списком всех свойств, разделенных точками. В редких случаях, когда свойство должно содержать точку в своём имени, можно начинать запрос с пробела для предотвращения интерпретации SMW этой точки специальным образом.
Замечание: Невозможно использовать подзапрос для получения списка свойств, которые затем используются в запросе. Смотрите #Подзапросы для свойств ниже.
Использование шаблонов и переменных[edit]
В запросе могут быть использованы произвольные шаблоны и переменные. Пример — это критерии выбора, которые отображают все грядущие события, основываясь на текущей дате:
[[Категория:Событие]] [[дата окончания::>{{CURRENTYEAR}}-{{CURRENTMONTH}}-{{CURRENTDAY}}]]
Ещё одна особенно полезная переменная для встроенных запросов — это {{FULLPAGENAME}}
— текущая страница с указанием её пространства имён, которая позволяет повторно использовать общий запрос на многих страницах. Пример этого смотрите на странице Property:Population. Для более детальной информации читайте про встроенные запросы.
Сортировка результатов[edit]
Часто полезно представлять результаты запроса в определенном порядке, например, выдавать список городов упорядоченным по численности населения. Special:Ask имеет простой интерфейс для добавления одного или более условий сортировки к запросу. Имя свойства, по которому производится сортировка, вводится в текстовое поле, и можно выбрать порядок по возрастанию или по убыванию. SMW обычно будет пытаться отсортировать результаты в естественном порядке, который могут иметь значения выбранного свойства: числа сортируются численно, строки сортируются в алфавитном порядке, даты сортируются хронологически. Порядок поэтому такой же, как и в случае компараторов < и > в запросах. Если не заданы особые условия сортировки, результаты будут упорядочены по названию своих страниц.
Возможно задать больше, чем одно условие сортировки. Если несколько результатов окажутся равными по первому условия сортировки, то следующее условие будет использоваться для их упорядочения, и т.д. Например, мы можем получить список городов по среднему числу дождливых дней в году, но сгруппировать их по стране расположения, с помощью следующего запроса:
{{#ask: [[Category:City]] |?Average rainy days |?Located in=Country |sort=Located in,Average rainy days |order=ASC,DESC }}
получив в результате
Сортировка запроса может также повлиять на результат запроса, потому что сортировать можно только по значениям свойства, которые страница действительно имеет. Следовательно, если запрос упорядочен по свойству (скажем «Население»), то SMW обычно ограничит результаты запроса только теми страницами, которые имеют хотя бы одно значение для этого свойства (то есть только страницами, для которых задано население). По этой причине, если запрос не требует, чтобы свойство присутствовало в каждом результате запроса, то SMW молча добавит это условие. Но SMW всегда будет пытаться сперва найти упорядочивающее свойство в заданном запросе и даже возможно упорядочить результаты запроса по подсвойствам. Вот некоторые примеры, иллюстрирующие это:
- [[Category:City]] [[Population::+]], упорядоченный по «Population», выдаст города с населением в возрастающем порядке. Результат запроса такой же, как и без сортировки.
- [[Category:City]], упорядоченный по «Population», снова выдаст города с населением в возрастающем порядке. Результат запроса может быть модифицирован из-за условия сортировки: если есть города без заданного населения, то они уже не появятся в результате.
- [[Category:City]] [[has location country.population::+]], упорядоченный по «Population», выдаст города, упорядоченные по населению стран, где они расположены. Результат запроса не изменился, но «population» теперь относится к свойству, использованному в подзапросе.
Если свойство, которое используется для сортировки, имеет больше, чем одно значение, для некоторой страницы, то эта страница всё равно появится только один раз в списке результатов. Позиция, которое страница займет в этом случае, не определяется SMW и может соответствовать любому из значений свойства. В вышеприведенных примерах это случится, если какой-то город будет иметь несколько заданных численностей населения или если какой-то город расположен в нескольких странах, для каждой из которых задано население. Предполагается избегать подобных ситуаций.
Результаты запроса, отображаемые в таблице результатов, могут также быть упорядочены динамически путём нажатия на небольших сортировочных иконах, расположенных в заголовке каждой колонки таблицы. Эта функция требует включенного JavaScript в браузере и будет сортировать только отображаемые результаты. Поэтому если, например, запрос выдал двадцать самых больших городов в мире по численности населения, можно отсортировать эти двадцать городов по алфавиту или в обратном порядке по численности населения, но запрос естественно не покажет двадцать самых маленьких городов в мире при обращении порядка сортировки в колонке численности населения. Динамическая сортировка таблиц стремится использовать тот же порядок, какой используется в запросах SMW, и, в особенности, упорядочивать числа и даты естественным образом. Однако, алфавитный порядок строк и имён страниц может немного отличаться от алфавитного порядка вики просто потому, что существует множество интернациональных алфавитов, которые могут быть упорядочены различным образом в зависимости от языковых настроек.
Ссылки на результаты семантического поиска[edit]
Ссылки на результаты семантического запроса в Special:Ask могут быть созданы посредством встроенного запроса SMW, как это объяснено в документации. Не рекомендуется создавать ссылки непосредственно, так как они очень длинные и используют специфическую кодировку. Разработчикам, которые создают расширения, ссылающиеся на Special:Ask, следует также использовать внутренние функции SMW для построения ссылок. Понимание деталей кодировки запросов SMW в ссылке является поэтому необязательным для использования SMW.
Вещи, которые невозможны[edit]
Подзапросы для свойств[edit]
Невозможно использовать подзапросы для получения списка свойств, которые затем используются в запросе. Можно, однако, использовать запрос, который выдаст список свойств, а потом скопировать и вставить результат в другой запрос. Альтернативно можно использовать шаблон формата результатов для передачи свойств непосредственно в другой запрос.
Запросы со специальными свойствами[edit]
SMW на данный момент не поддерживает запросы для значений любых встроенных в SMW специальных свойств, таких как «Имеет тип», «Допустимое значение» или «Эквивалентный URI».