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 |
+-----------------+---------------------+
我还想添加 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 = template
和 template = 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 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[ 提供=51=] 和 {{!}}
是 |
字符的虚拟模板。
如您所见,我成功抓取了以下页面关系:
- 地点到城市
- 城市到国家
- 国家到大陆
希望这对其他人也有帮助。
我仍在努力使我的 wiki 更加 "dynamic" 以消除重复数据。在我之前的
{{#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 |
+-----------------+---------------------+
我还想添加 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 = template
和 template = 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 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[ 提供=51=] 和 {{!}}
是 |
字符的虚拟模板。
如您所见,我成功抓取了以下页面关系:
- 地点到城市
- 城市到国家
- 国家到大陆
希望这对其他人也有帮助。