我正在使用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".
}
如果没有第4个三元组,则如果第3个?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>
答案 0 :(得分: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" .
但是我认为数据确实应该更正(用龟语法)uni:prof2 uni:member_of uni:dep1
。
您的数据确实存在问题,对于初学者或使用rdf / xml的有经验的人来说,这种情况并不罕见。
<rdf:Description rdf:about="uni:member_of">
...
此不表示您认为的含义。 rdf:about
和rdf:resource
属性采用完整的网址,而不是缩写形式。您应该使用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'unit:Person'(不存在),而'uni:Person'是缩写的URL,将使用uni前缀进行扩展。
当你在学习时,我强烈建议避免使用rdf / xml。 Turtle更容易读写,并且在很大程度上匹配SPARQL语法(减去变量)。
答案 1 :(得分:0)
显然这个错误发生在<uni:member_of>CEID</uni:member_of>
,这应该是对另一个资源的引用。正确的是<uni:member_of rdf:resource="uni:dep1"/>