2012-04-15 95 views
4

我在RDF文件中有一个rdf:collection。当我有一个作者的集合时,以下查询不会返回任何内容。但是,该查询适用于两位或更多作者,但只返回两位作者。我能做些什么来写出所有的作者?rdf:在sparql中的集合

<bibo:authorList rdf:parseType="Collection"> 
<rdf:Description rdf:about="http://openlibrary.org/authors/OL113143A"/> 
<rdf:Description rdf:about="http://openlibrary.org/authors/OL6784959A"/> 
</bibo:authorList> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX dc: <http://purl.org/dc/terms/> 

select ?title ?author ?author2 
where { 
    ?x dc:title ?title . 

    ?x bibo:authorList ?object. 
    ?object rdf:first ?name. 
    ?name rdf:value ?author. 

    ?object rdf:rest ?object2. 
    ?object2 rdf:first ?name2. 
    ?name2 rdf:value ?author2 . 
} 

回答

5

您的问题是你想的东西半递归因此您的结果取决于RDF列表的长度会有所不同。写入的查询仅适用于长度为2或更长的列表,长度为1的列表将不起作用,因为查询的第二部分没有任何匹配。

如果您要访问一个集合的最好办法是,像这样一个属性路径(需要SPARQL 1.1):

SELECT * WHERE 
{ 
    ?list rdf:rest*/rdf:first ?member . 
} 

您可以修改这个一般模式,以适应您的查询,你认为合适。

+0

对我使用ARC2进行SPARQL查询,所以我没有这样的请求。在某处写道:ARC2不支持SPARQL 1.1的子查询。如何使用SPARQL 1.0创建查询?如何在ARC2 SPARQL 1.1中安装? - – 2012-04-15 18:43:02

+0

@Magdalena ARC2不支持SPARQL 1.1,因此如果您使用的是ARC2,则无法使用此查询 – RobV 2012-04-16 16:17:21

+0

要使用什么而不是您的集合?我需要Arc2,我需要一些能取代我的收藏。 – 2012-04-16 20:07:15