2013-08-27 24 views
8

Có ai biết cách truy vấn Lớp học với Thuộc tính đối tượng trong Sparql không? Giả sử chúng tôi có tệp OWL chứa sauCách truy vấn Lớp với Thuộc tính đối tượng trong Sparql

Human ----(hasPizza)---> Pizzas 

Con người và pizza là các lớp (hoặc khái niệm). Trong SPARQL, truy vấn này trả về không có gì:

select ?x ?y where { 
    ?x hasPizza ?y 
} 

Nhưng nếu tôi thêm hai cá nhân (hoặc tổ chức) theo những khái niệm như

Human:Jim ----(hasPizza)---> Pizzas:cheesePizza 

truy vấn mà sẽ trở lại ?x=Jim?y=cheesePizza Làm thế nào tôi có thể nhận được ?x=Human?y=Pizza sử dụng SPARQL?

+3

bạn có thể đăng các phiên bản RDF của ontology của bạn? Các lớp không được liên kết trực tiếp bởi các thuộc tính trong OWL, nó thường được thực hiện thông qua một tiên đề hạn chế tồn tại. Vì vậy, hãy mở phiên bản RDF của bản thể luận của bạn và tìm cấu trúc; sau đó bạn có thể thử kết hợp nó với truy vấn SPARQL của bạn. – loopasam

+1

Có vẻ như bạn có một thuộc tính đối tượng 'hasPizza', _rdfs: domain_ và _rdfs: range_ trong số đó là' Human' và 'Pizzas', tương ứng. Điều này là tương đối dễ dàng để tìm kiếm quá, tuy nhiên, nhưng nó là một nhiệm vụ riêng biệt. –

Trả lời

16

dữ liệu Với như thế này (trong RDF/XML):

<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:owl="http://www.w3.org/2002/07/owl#" 
    xmlns:pizzas="http://example.org/pizzas#" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#" 
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"> 
    <owl:Ontology rdf:about="http://example.org/pizzas"/> 
    <owl:Class rdf:about="http://example.org/pizzas#Pizza"/> 
    <owl:Class rdf:about="http://example.org/pizzas#Human"/> 
    <owl:ObjectProperty rdf:about="http://example.org/pizzas#hasPizza"> 
    <rdfs:domain rdf:resource="http://example.org/pizzas#Human"/> 
    <rdfs:range rdf:resource="http://example.org/pizzas#Pizza"/> 
    </owl:ObjectProperty> 
    <owl:NamedIndividual rdf:about="http://example.org/pizzas#Jim"> 
    <rdf:type rdf:resource="http://example.org/pizzas#Human"/> 
    <pizzas:hasPizza> 
     <owl:NamedIndividual rdf:about="http://example.org/pizzas#CheesePizza"> 
     <rdf:type rdf:resource="http://example.org/pizzas#Pizza"/> 
     </owl:NamedIndividual> 
    </pizzas:hasPizza> 
    </owl:NamedIndividual> 
</rdf:RDF> 

hoặc tương đương, trong Rùa dễ đọc hơn:

@prefix :  <http://example.org/pizzas#> . 
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix pizzas: <http://example.org/pizzas#> . 
@prefix owl:  <http://www.w3.org/2002/07/owl#> . 
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> . 
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 

pizzas:Jim 
     a  pizzas:Human , owl:NamedIndividual ; 
     pizzas:hasPizza pizzas:CheesePizza . 

pizzas:hasPizza 
     a  owl:ObjectProperty ; 
     rdfs:domain pizzas:Human ; 
     rdfs:range pizzas:Pizza . 

pizzas:Human 
     a  owl:Class . 

pizzas:Pizza 
     a  owl:Class . 

<http://example.org/pizzas> 
     a  owl:Ontology . 

pizzas:CheesePizza 
     a  pizzas:Pizza , owl:NamedIndividual . 

thông báo rằng sự khẳng định Jim hasPizza CheesePizza là một trong ba trong đồ thị. Các tiên đề tên miền và phạm vi cho thuộc tính đối tượng hasPizza là hai bộ ba: hasPizza rdfs:domain HumanhasPizza rdfs:range Pizza. Truy vấn SPARQL phù hợp với mẫu truy vấn so với các bộ ba trong biểu đồ. Như vậy, từ một truy vấn như:

prefix :  <http://example.org/pizzas#> 

select ?x ?y where { 
    ?x :hasPizza ?y 
} 

bạn sẽ nhận được kết quả như

$ arq --data pizzas.ttl --query query.sparql 
----------------------- 
| x | y   | 
======================= 
| :Jim | :CheesePizza | 
----------------------- 

vì có một triple trong đồ thị có vị ngữ là :hasPizza, và rằng ba có :Jim như chủ đề, và :CheesePizza làm đối tượng. Có vẻ như bạn đang thực sự yêu cầu miền và phạm vi thuộc tính :hasPizza, cũng dễ dàng truy xuất. Sử dụng một truy vấn như thế này:

prefix :  <http://example.org/pizzas#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

select ?domain ?range where { 
    :hasPizza rdfs:domain ?domain ; 
      rdfs:range ?range . 
} 

và bạn sẽ nhận được kết quả như thế này:

$ arq --data pizzas.ttl --query query.sparql 
------------------- 
| domain | range | 
=================== 
| :Human | :Pizza | 
------------------- 
Các vấn đề liên quan