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]]
使用以下类型声明属性:
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 是否有任何查询 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
假设我想 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]]
使用以下类型声明属性:
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 是否有任何查询 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