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]]
Город: Амстердам
{{#set: | ref:country = Country:Netherlands | self:name = Amsterdam }}
[[Category:Cities]]
Место проведения:Heineken Music Hall
{{#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 предназначен только для "плоских" / помеченных отношений?
Обновить
Я не был очень конкретным о том, что я хочу получить. Допустим, вы должны описать событие, которое может быть преобразовано в удобочитаемую форму. В настоящее время в неструктурированной вики вы можете использовать собственный шаблон, подобный следующему:
{{Event
| date = 2012-12-03
| country = Netherlands
| city = Amsterdam
| venue = Heineken Music Hall
}}
со следующим сгенерированным результатом:
Выступление 3 декабря 2012 года состоялось в концертном зале Heineken Music Hall в Амстердаме, Нидерланды.
Я ищу то, что позволило бы создать следующий шаблон в Semantic MediaWiki:
{{Event
| date = 2012-12-03
| ref:venue = Venue:Heineken Music Hall
}}
Таким образом, страна и город могут быть получены автоматически, имея отношения, определенные как-то выше, но все же давая результат: представление на..., Нидерланды.
1 ответ
Во-первых, толстая кишка :
кажется не очень безопасным в использовании. Я изменил это на пробел. Во-вторых, 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}}
Выход:
Спектакль состоялся в концертном зале Heineken Music Hall, Амстердам, Нидерланды, Европа.