假设我想在"知识图谱"中链接几个维基页面。假设,这里有一个从大到小的地理对象的快速列表,其中箭头表示直接的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]]
城市:阿姆斯特丹
{{#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:continent
,ref:country
,ref: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:Netherlands
和City:Amsterdam
。 {{#ask: [[Category:Venues]] [[ref:continent::Continent:Europe]] }}
不起作用,因为查询将两个永远不会一起出现在同一页中的属性组合在一起。那么,Semantic MediaWiki是否有任何查询语法/能力允许指定中间关系,以便它可以"爬行"和"内部连接",从而为欧洲的所有场所提供服务?
是否可以以某种方式跨指定中间关系的多个页面进行查询?还是 SMW 专为"平面"/标记关系而设计?
更新
我不是很具体地说明我想得到什么。假设,您必须描述一个可以转换为人类可读形式的事件。目前,在非结构化 wiki 中,您可以使用类似于以下内容的自定义模板:
{{Event
| date = 2012-12-03
| country = Netherlands
| city = Amsterdam
| venue = Heineken Music Hall
}}
生成结果如下:
演出于2012年12月3日在荷兰阿姆斯特丹的喜力音乐厅举行。
我正在寻找的是允许在语义媒体维基中编写以下模板的东西:
{{Event
| date = 2012-12-03
| ref:venue = Venue:Heineken Music Hall
}}
因此,国家和城市可能会自动获得上面以某种方式定义的关系,但仍然给出结果:在...,荷兰的表现。
首先,冒号:
似乎不太安全。我已将其更改为空格。其次,SMW 支持反属性和子查询,因此以下代码回答了核心中的问题:
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}}
输出:
演出在欧洲荷兰阿姆斯特丹喜力音乐厅举行