【问题标题】:Semantic MediaWiki: Is it possible to use subqueries rather than properties for tables?Semantic MediaWiki:是否可以使用子查询而不是表的属性?
【发布时间】:2023-04-06 15:02:01
【问题描述】:

我仍在努力使我的 wiki 更加“动态”,以消除重复数据。在我之前的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 |
+-----------------+---------------------+

我还想添加 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}}}...参数来使用这种方法提取绑定城市,但我似乎无法提取国家(提取简单:日期、地点;复杂:城市;不能:国家) .同样使用模板方法似乎很脆弱,对我来说不是很一致。

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

【问题讨论】:

    标签: mediawiki semantic-mediawiki


    【解决方案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>
    

    在上面的模板中,为了方便起见,我使用命名参数。但是,我使用#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 提供,{{!}}| 字符。

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

    • 城市地点
    • 城市到国家
    • 国家/地区

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2011-08-21
      相关资源
      最近更新 更多