Semantic MediaWiki:是否可以使用子查询而不是表的属性?

Semantic MediaWiki: Is it possible to use subqueries rather than properties for tables?

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

{{#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]]}}

使用内联查询检索地点、城市(阿姆斯特丹)和国家/地区(荷兰)。但是我不确定这种方法是否适用于 tables。据我所知,#ask 可以从直接属性中生成 table 列:

{{#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 = templatetemplate = TEMPLATE_NAME 的模板。我设法通过创建所需的模板并解析 {{{1}}}... 参数,使用这种方法提取了绑定城市,但我似乎无法提取国家(提取简单:日期、地点;复杂:城市;无法:国家)。此外,使用模板方法似乎很脆弱,对我来说不是很一致。

是否可以为 tables 指定 subqueries/expressions 而不是属性 以从 Semantic MediaWiki 中间接绑定的页面中提取属性(可能从不使用模板)?

据我了解,这在 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 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[ 提供=51=] 和 {{!}}| 字符的虚拟模板。

如您所见,我成功抓取了以下页面关系:

  • 地点到城市
  • 城市到国家
  • 国家到大陆

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