语义MediaWiki:是否可以对表使用子查询而不是属性?

语义MediaWiki:是否可以对表使用子查询而不是属性?,mediawiki,semantic-mediawiki,Mediawiki,Semantic Mediawiki,我仍在努力使我的wiki更加“动态”,以消除重复数据。在上一篇文章中,我问如何绑定多个页面并通过绑定的页面检索属性。因为这个问题已经在简单的情况下解决了(但是我不太喜欢我的解决方案),所以我想让它在表中工作。让我们再考虑我在我的问题中提到的相同的页面和属性结构,因此下面的代码 {{#ask: [[Category:Venues]] [[Self name::Heineken Music Hall]]}} {{#ask: [[Category:Cities]] [[-Ref city.Self n

我仍在努力使我的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 |
+-----------------+---------------------+
我还想添加城市和国家栏。问题是,正如我前面提到的,城市和国家属性没有直接放入场馆页面,因此
#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\u NAME
来使用模板。通过创建所需的模板并解析
{{{{{1}}}
,我成功地使用这种方法提取了绑定的城市。。。参数,但我似乎无法提取国家(提取简单:日期、地点;复杂:城市;无法:国家)。同时,使用模板的方法对我来说似乎很脆弱,也不太一致


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

据我所知,这在语义MediaWiki中不可能直接实现,但可以解决。简而言之,模板格式是必需的,如下所示:

{{#ask: [[Category:Live events]]
| ?Self date = Date
| ?Ref venue = Venue
| mainlabel = -
| format = template
| template = Row:Live events table
| named args = yes
}}
模板:行:实时事件表
模板如下:

<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>
提取当前页的属性。第二个名为
SHOW REF
的模板简化了给定页面(而不是当前页面)的数据提取:

<includeonly>{{#show: {{PARSE_SMW_PAGE | {{{1|}}} }} | {{{2|}}}}}</includeonly>
#explode
#pos
由Extension:StringFunctions提供,
#ifeq
由Extension:ParserFunctions提供,
{!}
字符的虚拟模板

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

  • 地点到城市
  • 城市到国家
  • 国与洲
希望这对其他人也有帮助

<includeonly>{{#show: {{PARSE_SMW_PAGE | {{{1|}}} }} | {{{2|}}}}}</includeonly>
<includeonly>{{#explode:
{{#sub: {{{1}}} | {{#ifeq: {{#pos: {{{1}}} | [:}} | 1 | 3 | 2 }} | -2 }}
| {{!}}
}}</includeonly>