SPARQL查询结果不符合预期

7 投票
2 回答
870 浏览
提问于 2025-04-15 15:12

我希望有人能帮我解决这个可能非常简单的问题:

我想对以下的RDF数据运行一个SPARQL查询(这个数据用N3格式表示,RDF/XML格式的文件可以在这里找到)。这些数据描述了一篇期刊文章,以及期刊、作者和出版商的信息:

 @prefix bibo: <http://purl.org/ontology/bibo/> .
 @prefix dc: <http://purl.org/dc/elements/1.1/> .
 @prefix ex: <http://example.org/thesis/> .
 @prefix foaf: <http://xmlns.com/foaf/0.1/> .
 @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<ex:XY>     a bibo:Article;
     dc:creator ex:umstaetter;
     dc:date "2008-11-01";
     dc:isPartOf ex:bibdienst;
     dc:title "DDC in Europa"@de;
     bibo:endPage "1221";
     bibo:issue "11";
     bibo:language "de";
     bibo:pageStart "1194";
     bibo:uri <http://www.zlb.de/Erschliessung020309BD.pdf>;
     bibo:volume "42" .

<ex:bibdienst>     a bibo:Journal;
     dc:publisher ex:zlb;
     dc:title "Bibliotheksdienst"@de;
     bibo:issn "00061972" .

<ex:umstaetter>     a foaf:person;
     foaf:birthday "1941-06-12";
     foaf:gender "Male";
     foaf:givenName "Walther";
     foaf:homepage <http://www.ib.hu-berlin.de/~wumsta/index.html>;
     foaf:img "http://libreas.eu/ausgabe7/pictures/wumstaetter1.jpg";
     foaf:name "Walther Umst\u00E4tter";
     foaf:surname "Umst\u00E4tter";
     foaf:title "Prof. Dr. rer. nat." .

<ex:zlb>     a foaf:Organization;
     foaf:homepage <http://www.zlb.de>;
     foaf:name "Zentral- und Landesbibliothek Berlin"@de .

为了测试,我想读取foaf:homepage的内容,针对ex:zlb的SPARQL查询是:

PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX bibo: <http://purl.org/ontology/bibo/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX ex: <http://example.org/thesis/>

SELECT ?article ?publisher ?publisher_url
WHERE 
{
    ?article dc:isPartOf ?journal .
    ?journal dc:publisher ?publisher .
    ?publisher foaf:homepage ?publisher_url
}

(再说一次:这只是为了测试,因为只有一篇文章的实体。)

我在本地机器上用Python和RDFlib运行这个查询,但没有得到结果。在线的Redland SPARQL查询演示也没有返回结果。

有没有人能看到解决办法?我是在正确的方向上,还是完全走错了?

2 个回答

6

没错,Stephen C说得完全正确,你不能在XML的属性中使用QName(命名空间的简写)。不过,你可以使用XML实体来代替,这些实体需要在文档顶部的DTD块中定义,像这样:

例如:

<!DOCTYPE rdf:RDF[
    <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
    <!ENTITY rdfs 'http://www.w3.org/2000/01/rdf-schema#'>
    <!ENTITY xsd 'http://www.w3.org/2001/XMLSchema#'>
    <!ENTITY ex 'http://example.org/thesis/'>
    <!ENTITY dc 'http://purl.org/dc/elements/1.1/'>
    <!ENTITY foaf 'http://xmlns.com/foaf/0.1/'>
    <!ENTITY bibo 'http://purl.org/ontology/bibo/'>
]>

然后你可以这样定义属性:

<bibo:Journal rdf:about="&ex;bibdienst">
7

我觉得在XML的属性值中不能使用QName,比如rdf:about的值。所以我们来看一下你RDF/XML文件中的这一行:

 <bibo:Journal rdf:about="ex:bibdienst">

我认为这实际上是在说主题的URI是“ex:bibdienst”。这个URI的写法是正确的,但它和这一行对应的三元组中的对象URI并不是同一个:

 <dc:isPartOf rdf:resource="http://example.org/thesis/bibdienst" />

试着把XML属性值中的QName替换成对应的URI,看看这样是否能解决你的问题。

撰写回答