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 и {{!}} это фиктивный шаблон для | персонаж.

Как видите, мне удалось просканировать следующие отношения страниц:

  • Место в город
  • Город в страну
  • Страна на континент

Надеюсь, это поможет кому-то еще.

Другие вопросы по тегам