Semantic MediaWiki:如何查询具有中间关系的页面?

时间:2016-01-31 21:52:06

标签: mediawiki semantic-mediawiki

假设我想在"知识图表中链接几个维基页面"。让我们说,这里是一个从大到小的地理对象的快速列表,其中箭头表示直接的MediaWiki链接:

Continent:Europe
^__Country:Netherlands
   ^__City:Amsterdam
      ^__Venue:Heineken Music Hall

上述页面包含以下内容:

洲:欧洲

{{#set: | self:name = Europe }}
[[Category:Continents]]

国家:荷兰

{{#set: | ref:continent = Continent:Europe | self:name = Netherlands }}
[[Category:Countries]]

城市:Amsterdam

{{#set: | ref:country = Country:Netherlands | self:name = Amsterdam }}
[[Category:Cities]]

地点:喜力音乐厅

{{#set: | ref:city = City:Amsterdam | self:name = Heineken Music Hall }}
[[Category:Venues]]

使用以下类型声明属性:

  • self:name[[has type::text]]
  • ref:continentref:countryref:city[[has type::page]]

据我了解Semantic MediaWiki的工作原理,#ask函数适用于一个级别。让我们说,{{#ask: [[self:name::+]] }}可以获取所有4个页面,因为所有页面都设置了self:name属性。我还可以通过过滤掉某个类别来缩小搜索结果范围:{{#ask: [[Category:Venues]] [[ref:city::City:Amsterdam]] }}。这样可以获得直接相关的页面(这很简单,因为Venue:Heineken Music Hall页面直接与City:Amsterdam页面相关)。

现在,让我们说,我想展示位于Continent:Europe的所有场地,因此应该以某种方式隐含地考虑Country:NetherlandsCity:Amsterdam{{#ask: [[Category:Venues]] [[ref:continent::Continent:Europe]] }}无效,因为查询结合了两个永远不会出现在同一页面的属性。那么,Semantic MediaWiki是否具有任何查询语法/能力,允许指定中间关系,以便它可以“爬行”#34;和"内部联接"给欧洲的所有场地

是否有可能以某种方式查询指定中间关系的多个页面?或者SMW是否仅为"平坦" /标记的关系设计?

更新

我对我想要得到的东西并不是很具体。让我们说,你必须描述一个可以转化为人类可读形式的事件。目前,在非结构化wiki中,您可以使用类似于此的自定义模板:

{{Event
| date = 2012-12-03
| country = Netherlands
| city = Amsterdam
| venue = Heineken Music Hall
}}

生成以下结果:

  

2012年12月3日的表演在荷兰阿姆斯特丹的喜力音乐厅举行。

我正在寻找的东西可以在Semantic MediaWiki中组成以下模板:

{{Event
| date = 2012-12-03
| ref:venue = Venue:Heineken Music Hall
}}

因此,国家和城市可能会自动获得上面以某种方式定义的关系,但仍然给出了结果:在...上的表现,荷兰

1 个答案:

答案 0 :(得分:1)

首先,冒号:似乎不太安全。我把它改成了一个空间。其次,SMW支持inverse propertiessubqueries,因此以下代码回答了核心问题:

The performance took place at
{{#ask: [[Category:Venues]] [[Self name::Heineken Music Hall]]}},
{{#ask: [[Category:Cities]] [[-Ref city::<q>[[Self name::Heineken Music Hall]]</q>]]}},
{{#ask: [[Category:Countries]] [[-Ref country::<q>[[-Ref city::<q>[[Self name::Heineken Music Hall]]</q>]]</q>]]}},
{{#ask: [[Category:Continents]] [[-Ref continent::<q>[[-Ref country::<q>[[-Ref city::<q>[[Self name::Heineken Music Hall]]</q>]]</q>]]</q>]]}}

相同但更短:

The performance took place at
{{#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: [[Category:Continents]] [[-Ref continent.-Ref country.-Ref city.Self name::Heineken Music Hall}}

输出:

  

演出在荷兰阿姆斯特丹喜力音乐厅举行