Semantic MediaWiki: Возможно ли использовать подзапросы, а не свойства для таблиц?
Я все еще пытаюсь сделать свою вики более "динамичной", чтобы избавиться от дублированных данных. В моем предыдущем вопросе я спрашивал, как я могу связать несколько страниц и получить свойства через связанные страницы. Поскольку этот вопрос уже решен для простых случаев (однако мне там не нравится мое решение), я бы хотел, чтобы он работал для таблиц. давайте рассмотрим ту же структуру страниц и свойств, о которой я упоминал в своем вопросе, поэтому приведем следующий код
{{#ask: [[Category:Venues]] [[Self name::Heineken Music Hall]]}}
{{#ask: [[Category:Cities]] [[-Ref city.Self name::Heineken Music Hall]]}}
{{#ask: [[Category:Countries]] [[-Ref country.-Ref city.Self name::Heineken Music Hall]]}}
извлекает место, город (Амстердам) и страну (Нидерланды), используя встроенные запросы. Однако я не уверен, возможен ли такой подход для таблиц. Насколько я знаю, #ask
может генерировать таблицу, генерирующую столбцы из прямых свойств:
{{#ask: [[Category:Live events]]
| ?Self date = Date
| ?Ref venue = Venue
| mainlabel = -
}}
Выход:
+-----------------+---------------------+
| Date | Venue |
+-----------------+---------------------+
| 3 December 2012 | Heineken Music Hall |
+-----------------+---------------------+
Я также хотел бы добавить столбцы Город и Страна. Проблема в том, что, как я упоминал выше, свойства города и страны не помещаются непосредственно на страницу места проведения, поэтому #ask
функция может использовать встроенные подзапросы. Но я не могу заставить это работать:
{{#ask: [[Category:Live events]]
| ?Self date = Date
| ?Ref venue = Venue
| ?WHAT_EXPRESSION_HERE? = City
| ?EVEN_MORE_COMPLEX_EXPRESSION_HERE? = Country
| mainlabel = -
}}
Первое, о чем я думаю, это использование шаблонов с использованием format = template
а также template = TEMPLATE_NAME
, Мне удалось извлечь связанный город, используя этот подход, создав необходимый шаблон и разбор {{{1}}}
... параметры, но я не могу извлечь страну (просто извлечь: дата, место проведения; комплекс: город; не в состоянии: страна). Также использование подхода шаблонов кажется хрупким и не очень последовательным для меня.
Можно ли указывать подзапросы / выражения, а не свойства для таблиц, чтобы извлекать свойства из косвенно связанных страниц в Semantic MediaWiki (возможно, никогда не используя шаблоны)?
1 ответ
Насколько я понимаю, это невозможно в Semantic MediaWiki напрямую, однако это можно обойти. Короче, формат шаблона обязателен, и вот он:
{{#ask: [[Category:Live events]]
| ?Self date = Date
| ?Ref venue = Venue
| mainlabel = -
| format = template
| template = Row:Live events table
| named args = yes
}}
Template:Row:Live events table
Шаблон выглядит следующим образом:
<includeonly><!--
-->{{#vardefine: DATE | {{{?Date}}}}}<!--
-->{{#vardefine: VENUE | {{{?Venue}}}}}<!--
-->{{#vardefine: CITY | {{SHOW_REF|{{#var: VENUE}}|?Ref city}}}}<!--
-->{{#vardefine: COUNTRY | {{SHOW_REF|{{#var: CITY}}|?Ref country}}}}<!--
-->{{#vardefine: CONTINENT | {{SHOW_REF|{{#var: COUNTRY}}|?Ref continent}}}}<!--
-->{{#var: DATE}}, {{#var: VENUE}}, {{#var: CITY}}, {{#var: COUNTRY}} {{#var: FLAG}}, {{#var: CONTINENT}}<br/><!--
--></includeonly>
В приведенном выше шаблоне я использую именованные аргументы для простоты. Тем не менее, я использую #vardefine
а также #var
сохранить и извлечь некоторые данные из текущей строки. Эти функции предоставляются расширением Extension:Variables. Также я использую два вспомогательных шаблона: SHOW SELF
а также SHOW REF
упростить извлечение данных. Первый шаблон, SHOW SELF
, просто ярлык:
<includeonly>{{#show: {{FULLPAGENAME}} | {{{1|}}}}}</includeonly>
извлечь свойство для текущей страницы. Второй шаблон называется SHOW REF
упрощает извлечение данных для данной страницы, а не текущей:
<includeonly>{{#show: {{PARSE_SMW_PAGE | {{{1|}}} }} | {{{2|}}}}}</includeonly>
И да, PARSE SMW PAGE
просто удаляет левую и правую скобки и необязательный ведущий двоеточие:
<includeonly>{{#explode:
{{#sub: {{{1}}} | {{#ifeq: {{#pos: {{{1}}} | [:}} | 1 | 3 | 2 }} | -2 }}
| {{!}}
}}</includeonly>
#explode
а также #pos
поставляются из Extension: StringFunctions, #ifeq
поставляется из Extension:ParserFunctions и {{!}}
это фиктивный шаблон для |
персонаж.
Как видите, мне удалось просканировать следующие отношения страниц:
- Место в город
- Город в страну
- Страна на континент
Надеюсь, это поможет кому-то еще.