在 SPARQL 中获取 "Point-in time" 属性 的所有文章

Getting all articles with "Point-in time" property in SPARQL

我想查询所有具有 属性 P585(时间点)的维基百科文章。不幸的是,其中一些非常模糊,并且在子子属性下,如图所示。我希望能够过滤这些日期,无论它们是什么属性。

查询:“?item p:P585/ps:P585 ?date.”只返回时间点是根类别的结果,无论我尝试什么,我都无法得到所有结果在某处有“时间点”的文章。或者,如果不可能,至少我希望能够指定“重大事件/*/时间点”...

谢谢!

问题是您希望 'point in time' 成为符合条件的 属性 而不是您当前所写的 属性 声明。让我通过考虑以下关于 Q76(巴拉克奥巴马)和 P26(配偶)的查询来阐明我的意思:

SELECT *
WHERE {
  wd:Q76 p:P26 ?statement .
  ?statement ?p ?o
     }

ps:P26 告诉我们语句的对象是谁,即米歇尔奥巴马。

注意:通常你会发现每个 ?a p:Px/ps:Px ?b 都有 ?a wdt:Px ?b(这取决于陈述的等级,例如有两个关于奥巴马出生地的陈述,在将它列为夏威夷,另一个列为肯尼亚,但只有列出夏威夷的语句排名高到足以保证直接 link 与 wdt)。

但是,如果我们想找到关于语句的限定属性(例如,奥巴马夫妇何时结婚,在哪里等),那么我们需要一个不同的命名空间,在本例中为 pq,其中 'q'代表限定符。

这与您的示例有何关系? 在您的示例中,您要查找的 'main' 属性 是 'significant event',因此 P793,限定符是 P585.

因此您的查询应该是这样的:

SELECT *
WHERE {
?subject p:P793 ?statement .
?statement pq:P585 ?date .
}

或简称:

SELECT *
WHERE {
?subject p:P793/pq:P585 ?date .
}

如果您对重大事件的对象更感兴趣(在您的示例中是 'rocket launch' Q797476),那么您可以这样指定:

SELECT *
WHERE {
?subject p:P793 ?statement .
?statement pq:P585 ?date ;
           ps:P793 wd:Q797476 .
}

注意命名空间和 属性 数字所起的作用。