1

我仍在尝试使我的 wiki 更加“动态”,以消除重复数据。在我之前的问题中,我问我如何绑定多个页面并通过绑定页面检索属性。由于这个问题已经在简单的情况下得到解决(但是我不太喜欢我的解决方案),我想让它适用于表格。让我们再次考虑我在问题中提到的相同页面和属性结构,因此以下代码

{{#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 |
+-----------------+---------------------+

我还想添加CityCountry列。问题是,正如我上面提到的,城市和国家属性没有直接放入Venue页面,因此该#ask函数可能使用内联子查询。但我不能让它工作:

{{#ask: [[Category:Live events]]
| ?Self date = Date
| ?Ref venue = Venue
| ?WHAT_EXPRESSION_HERE? = City
| ?EVEN_MORE_COMPLEX_EXPRESSION_HERE? = Country
| mainlabel = -
}}

我首先想到的是使用模板使用format = templateand template = TEMPLATE_NAME。我设法通过创建所需的模板并解析{{{1}}}...参数来使用这种方法提取绑定的城市,但我似乎无法提取国家(提取简单:日期、地点;复杂:城市;不能:国家)。同样使用模板方法似乎很脆弱,对我来说不是很一致。

是否可以指定子查询/表达式而不是的属性以从 Semantic MediaWiki 中的间接绑定页面中提取属性(可能从不使用模板)?

4

1 回答 1

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>

在上面的模板中,为了方便起见,我使用命名参数。但是,我使用#vardefineand#var来存储和检索当前行中的一些数据。这些函数由Extension:Variables扩展提供。我还使用了两个辅助模板:SHOW SELFSHOW 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并且#posExtension:StringFunctions提供,#ifeqExtension:ParserFunctions提供,并且{{!}}|角色的虚拟模板。

如您所见,我设法爬取了以下页面关系:

  • 前往城市的地点
  • 城市到国家
  • 国家到大陆

希望这对其他人也有帮助。

于 2016-03-10T22:37:52.817 回答