#sparql #wikidata
Вопрос:
Я хотел бы запросить все статьи Википедии, которые имеют свойство P585 (момент времени). К сожалению, некоторые из них очень неясны и находятся в под-под свойствах, как на картинке. Я хотел бы иметь возможность фильтровать эти даты, независимо от того, в какой собственности они находятся.
Запрос: «?элемент p:P585/ps:P585 ?свидание. «возвращает результаты только там, где точка во времени является корневой категорией, и, что бы я ни пытался, я не могу получить все статьи, в которых где-то есть «точка во времени». Или, если это невозможно, по крайней мере, я хотел бы иметь возможность указать «значительное событие/*/момент времени»…
Спасибо!
Ответ №1:
Проблема в том, что вы хотите, чтобы «момент времени» был квалифицируемым свойством, а не свойством заявления, как вы написали в данный момент. Позвольте мне уточнить, что я имею в виду, рассматривая следующий вопрос о Q76
(Бараке Обаме) и P26
(супруге):
SELECT *
WHERE {
wd:Q76 p:P26 ?statement .
?statement ?p ?o
}
ps:P26
говорит нам, кто является объектом заявления, то есть Мишель Обама.
Примечание: Часто вы обнаружите, что для каждого ?a p:Px/ps:Px ?b
есть ?a wdt:Px ?b
(это зависит от ранга заявления, например, есть два заявления о месте рождения Обамы, в котором он указан как Гавайи, другое-как Кения, но только заявление, в котором перечислены Гавайи, занимает достаточно высокое место, чтобы гарантировать прямую связь с wdt
).
Однако, если мы хотим найти определяющие свойства в заявлении (например, когда Обамы были женаты, где и т. Д.), Тогда нам нужно другое пространство имен, в данном случае pq
, где » q » означает определитель.
Как это тогда соотносится с вашим примером? В вашем примере «основное» свойство, которое вы ищете, — это «значимое событие», поэтому P793
и квалификатор P585
.
Таким образом, ваш запрос должен быть таким:
SELECT *
WHERE {
?subject p:P793 ?statement .
?statement pq:P585 ?date .
}
Или для краткости:
SELECT *
WHERE {
?subject p:P793/pq:P585 ?date .
}
Если вас дополнительно интересует объект значимого события (в вашем примере это «запуск ракеты» Q797476
), то вы можете указать это следующим образом:
SELECT *
WHERE {
?subject p:P793 ?statement .
?statement pq:P585 ?date ;
ps:P793 wd:Q797476 .
}
Обратите внимание на роль, которую играют пространства имен и номера свойств.
Комментарии:
1. Большое вам спасибо за подробное объяснение, это помогает!