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

时间:2016-03-06 23:44:19

标签: mediawiki semantic-mediawiki

我仍然试图让我的维基更多"动态"为了摆脱重复的数据。在我之前的question中,我问我如何绑定多个页面并通过绑定页面检索属性。由于这个问题已经解决了简单的情况(但我不太喜欢我的解决方案),我想让它适用于表格。让我们再考虑我在问题中提到的相同页面和属性结构,因此下面的代码

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

我还想添加 City Country 列。问题是,正如我上面提到的,城市和国家/地区属性没有直接放入 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使用模板。我设法通过创建所需模板并解析{min} ...参数来使用这种方法提取绑定城市,但我似乎无法提取国家(提取简单:日期,地点;复杂:城市;不能:国家)。同样使用模板方法似乎很脆弱,对我来说也不是很一致。

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

1 个答案:

答案 0 :(得分:0)

据我了解,这在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: {#explode} | {{#ifeq: {{#pos: {#pos} | [:}} | 1 | 3 | 2 }} | -2 }}
| {{!}}
}}</includeonly>

#ifeq{{!}} Extension:StringFunctions 提供,| Extension:ParserFunctions 和{{1}提供}}是 let dater = NSDate() let dayTimePeriodFormatter = NSDateFormatter() dayTimePeriodFormatter.locale = NSLocale.currentLocale() dayTimePeriodFormatter.timeZone = NSTimeZone(name: "UTC") dayTimePeriodFormatter.dateFormat = "H:s" var dateString = dayTimePeriodFormatter.stringFromDate(dater) 字符的虚拟模板。

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

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

希望这也有助于其他人。