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

Semantic MediaWiki: How do I make a query for pages with intermediate relationships?

假设我想 link 几个 wiki 页面 "knowledge graph"。比方说,这是一个从大到小的地理对象快速列表,其中箭头表示直接 MediaWiki link:

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]]

城市:阿姆斯特丹

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

地点:喜力音乐厅

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

使用以下类型声明属性:

据我了解 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 是否有任何查询 syntax/ability 允许指定中间关系,因此它可以 "crawl" 和 "inner join" 给出 欧洲的所有场所

是否可以跨多个页面查询指定中间关系?还是 SMW 仅针对 "flat"/标记关系设计?


更新

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

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

生成的结果如下:

The performance on December 3, 2012 took place at Heineken Music Hall in Amsterdam, Netherlands.

我正在寻找的是可以在 Semantic MediaWiki 中编写以下模板的东西:

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

因此,国家和城市可能会自动获得具有上面以某种方式定义的关系,但仍然给出结果:The performance on ..., Netherlands.

首先,冒号:好像用起来不太安全。我已将其更改为 space。其次,SMW支持inverse properties and subqueries,因此下面的代码回答了核心问题:

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}}

输出:

The performance took place at Heineken Music Hall, Amsterdam, Netherlands, Europe