2012-03-19 60 views

回答

4

有趣的问题,因为它似乎很简单,但它很难正确表达查询。 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,则只有列表的开始才通过谓词连接到其他实体。而且,列表通常总是以某种方式与其他实体连接,因为在独立于别的地方描述列表上没有意义。

+0

谢谢Antoine,你确定了一个非常重要的点与被连接的东西。当我在一个只有一个列表的数据集上进行查询时,我没有想到它。 – user1278577 2012-03-20 12:47:58

3

其实,这是一个很好的问题,因为它不是一个特别简单的解决方案。

在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,否则不要认为它是完整的。

+0

谢谢威廉。 – user1278577 2012-03-20 12:46:35