1

我正在使用 JENA,并且出于学习目的进行了一些简单的查询。其中之一是:

PREFIX uni:<http://www.university.fake/university#>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>

SELECT ?person
WHERE {
    ?person rdf:type/rdfs:subClassOf <uni:Person>.
    ?person uni:has_name ?name.
    ?person uni:member_of ?dep.
    ?dep uni:dep_city "Patras".
}

?dep如果没有第四个三元组,如果第三个被引用的值替换,其余的确实会产生结果。但是,当添加第四个三元组时,没有结果。三元组本身确实会在自己的查询中产生结果,所以我认为那里没有任何问题。

一些 RDF 数据:

<rdf:Property rdf:about="uni:member_of">
    <rdfs:domain rdf:resource="uni:Person"/>
    <rdfs:range rdf:resource="uni:Department"/>
</rdf:Property>
<rdf:Property rdf:about="uni:dep_city">
    <rdfs:domain rdf:resource="uni:Department"/>
    <rdfs:range rdf:resource="uni:Literal"/>
</rdf:Property>
<rdf:Description rdf:about="uni:dep1">
    <uni:dep_name>CEID</uni:dep_name>
    <uni:dep_city>Patras</uni:dep_city>
</rdf:Description>
<rdf:Description rdf:about="uni:prof2">
    <uni:has_name>Bob Ross</uni:has_name>
    <uni:has_phone>6981234566</uni:has_phone>
    <uni:has_age>52</uni:has_age>
    <uni:member_of>CEID</uni:member_of>
    <uni:teaches>Painting</uni:teaches>
    <rdf:type rdf:resource="uni:Professor"/>
</rdf:Description>
4

2 回答 2

4

啊哈,所以考虑到数据,根据一个人的观点,要么查询错误,要么数据建模错误。

就目前而言?person uni:member_of ?dep是行不通的。您可以加入uni:dep_name(假设这些是唯一键)。

?person uni:member_of ?dep_name .
?dep uni:dep_name ?dep_name ;
     uni:dep_city "Patras" .

但是我认为数据确实应该被纠正为 make (in turtle 语法) uni:prof2 uni:member_of uni:dep1

实际上,您的数据存在更严重的问题,这对于初学者甚至使用 rdf/xml 的有经验的人来说并不少见。

<rdf:Description rdf:about="uni:member_of">
   ...

并不意味着你认为它意味着什么。rdf:aboutrdf:resource属性采用完整的 URL,而不是缩写形式。您应该使用rdf:about="http://example.com/namespace/university#member_of", 或任何 uni 命名空间的 URL。

这个错误就是为什么你有:

?person rdf:type/rdfs:subClassOf <uni:Person>

而不是:

?person rdf:type/rdfs:subClassOf uni:Person

在 SPARQL 中,turtle<uni:Person>匹配 URL 'uni:Person'(不存在),而 'uni:Person' 是一个缩写 URL,它将使用 uni 前缀进行扩展。

当您学习时,我强烈建议您避免使用 rdf/xml。Turtle 更容易读写,并且在很大程度上匹配 SPARQL 语法(减去变量)。

于 2012-11-24T15:54:02.810 回答
0

显然错误出现在 中<uni:member_of>CEID</uni:member_of>,它应该是对另一个资源的引用。正确的是<uni:member_of rdf:resource="uni:dep1"/>

于 2012-11-24T18:45:33.990 回答