6

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

<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 . 
}
4

1 回答 1

7

您的问题是您正在尝试进行半递归,因此您的结果会因 RDF 列表的长度而异。所写的查询仅适用于长度为 2 或更长的列表,长度为 1 的列表将不起作用,因为您的查询的第二部分将没有任何匹配项。

如果你想访问一个集合,最好的方法是使用这样的属性路径(需要 SPARQL 1.1):

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

您可以调整此通用模式以适应您认为合适的查询。

于 2012-04-15T14:55:58.023 回答