列表这是正确的/最佳SPARQL查询来获取项目的数量在RDF:类别:(?COUNT(A)作为计数)?的RDF获得数:使用SPARQL
选择 其中{一http://www.w3.org/1999/02/22-rdf-syntax-ns#first?c}
在此先感谢您的帮助。
问候, 拉胡尔
列表这是正确的/最佳SPARQL查询来获取项目的数量在RDF:类别:(?COUNT(A)作为计数)?的RDF获得数:使用SPARQL
选择 其中{一http://www.w3.org/1999/02/22-rdf-syntax-ns#first?c}
在此先感谢您的帮助。
问候, 拉胡尔
有趣的问题,因为它似乎很简单,但它很难正确表达查询。 William Greenly's answer没有提供你想要的,尽管他在他的解释中是完全正确的,并且正确地使用了property path。为了能够正确地询问正确的查询来回答你的问题,必须假定所有列表都是正确的(它们只有一个第一个元素,一个休息,最后以零结束)。
查询中的问题是它会统计数据集中所有列表的所有成员。您需要将rdf:first
仅与一个列表中的元素相关联。
如果你有一个URI标识列表中选择您有兴趣,您可以执行以下操作:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX ex: <http://www.example.org/#>
SELECT (COUNT(?member) AS ?count)
WHERE {
ex:uriOfTheList rdf:rest*/rdf:first ?member
}
但往往,列表不会被URI标识。在这种情况下,可以通过使用其他属性来识别某些列表。例如,假设你有一个ex:listOfAuthors
属性,你可以这样做:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX ex: <http://www.example.org/#>
SELECT (COUNT(?member) AS ?count)
WHERE {
ex:publication ex:listOfAuthors ?list .
?list rdf:rest*/rdf:first ?member .
}
请注意,如果你简单地做:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT (COUNT(?member) AS ?count)
WHERE {
?list rdf:rest*/rdf:first ?member .
}
你加起来名单和子列表的所有大小。 如果您没有可以附加列表的谓词,并且您没有URI并且您可能想要为每个列表中的所有列表计数,现在情况会变得复杂。还有,应该工作的一种方式:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT (COUNT(?c) AS ?count)
WHERE {
?thing !rdf:rest ?list .
?list rdf:rest*/rdf:first ?member .
}
这是什么要说的是,我们要找到的东西,连接到列表中,但不与谓词rdf:rest
。原则上,如果实体不是列表本身且谓词不是rdf:rest
,则只有列表的开始才通过谓词连接到其他实体。而且,列表通常总是以某种方式与其他实体连接,因为在独立于别的地方描述列表上没有意义。
其实,这是一个很好的问题,因为它不是一个特别简单的解决方案。
在RDF列表中的重要条款是:
rdf:first
rdf:rest
rdf:nil
为多个项目的列表,建议您型号如下:使用RDF
a:a rdf:first a:b;
rdf:rest [
rdf:first a:c;
rdf:rest rdf:nil.
].
:无指示一个列表不再有任何更多的项目(所以本质上它是一个列表的列表)。然而,它也指出,你可以使用RDF:第一interderterminantly如下:
a:a rdf:first a:b;
rdf:first a:c;
rdf:rest rdf:nil.
RDF的要点:零是指定列表不再有任何项目。请记住,语义Web基于开放世界的假设,所以除非另有说明,否则不能仅仅因为它们不知道或陈述就认为该列表没有更多项目,因此需要个人rdf:nil。
幸运的是,在上面的例子中,两个都有一个查询,它依赖于支持SPARQL 1.1的处理器。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT (COUNT(?a) AS ?count)
WHERE {?a rdf:first+ ?c}
请记住,除非列表包含rdf:nil,否则不要认为它是完整的。
谢谢威廉。 – user1278577 2012-03-20 12:46:35
谢谢Antoine,你确定了一个非常重要的点与被连接的东西。当我在一个只有一个列表的数据集上进行查询时,我没有想到它。 – user1278577 2012-03-20 12:47:58