2012-11-24 133 views
1

我正在使用JENA,我正在为学习目的进行一些简单的查询。其中之一是:查询结果中没有结果SPARQL

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> 
+0

因此'?dep uni:dep_city“Patras”'起作用了吗?尝试从那里反向工作,那就是尝试'?person uni:member_of?dep。 ?dep uni:dep_city“Patras”等 – user205512

+1

另外,如果可能,请提供数据。很难诊断没有数据。 – user205512

+0

是的,它的工作原理。您建议的第二个查询不起作用,这可能是问题所在。RDF数据的一个示例是: \t Bob Ross \t 6981234566 \t 52 \t CEID \t 绘画 \t \t CEID \t Patras ' –

回答

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: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和龟<uni:Person>的URL 'UNI:人' 匹配(不存在),而'uni:Person'是一个缩写的URL,它将使用uni前缀进行扩展。

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

+0

感谢您的提示!我会尝试进入Turtle一段时间,但目前我仍然处于SPARQL基础。事实证明,我的数据的确是非常模糊的,因为我错误地认为,如果模式将它们指定为这些类型,推理引擎将识别来自不同资源的相同文字。 –

0

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