2012-11-24 8 views
1

저는 JENA를 사용 중이며 학습 목적으로 간단한 쿼리를 작성하려고합니다. 그 중 하나는 : 4 트리플 나머지없이쿼리 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". 
} 

는 3 일의 ?dep가 인용 한 값으로 대체되는 경우 결과를 않습니다. 그러나 4 번째 트리플을 추가 할 경우 결과가 없습니다. 트리플 자체는 자체 쿼리에서 결과를 생성하므로 거기에 문제가 있다고 생각하지 않습니다.

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"'works? 거꾸로 작업 해보십시오.'? person uni : member_of? dep. ? dep uni : dep_city "Patras"'등 – user205512

+1

또한 가능한 경우 데이터를 제공하십시오. 데이터없이 진단하기가 어렵습니다. – user205512

+0

예, 작동합니다. 당신이 제안하는 두 번째 쿼리는 작동하지 않으며 문제가있는 곳일 것입니다.RDF의 데이터의 예는 다음과 ' \t 밥 로스 \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에서

과 URL '유니 : 사람'을 일치 <uni:Person> 거북 (존재하지 않는) 반면, 'uni : Person'은 uni 접두사를 사용하여 확장되는 약식 URL입니다.

학습 할 때 rdf/xml을 피할 것을 강력히 권합니다. 터틀은 읽고 쓰는 것이 훨씬 쉬우 며 SPARQL 구문 (변수 제외)을 상당 부분 일치시킵니다.

+0

팁 주셔서 감사합니다! 나는 거북이에 들어가려고 노력할 것이다. 그러나 잠시 동안 나는 아직도 SPARQL의 기초에 머물러있다. 추측 엔진이 스키마에서 해당 유형을 지정하면 다른 리소스의 동일한 리터럴을 인식 할 것이라고 실수로 생각했기 때문에 실제로 내 데이터가 심각하게 모드가 변경된 것으로 나타났습니다. –

0

명백히 실수는 <uni:member_of>CEID</uni:member_of>이었습니다. 다른 리소스를 참조한 것이 틀림 없습니다. 올바른 것은 <uni:member_of rdf:resource="uni:dep1"/>