2012-08-29 34 views
6

Tôi đang cố tìm nạp các thuộc tính cụ thể nhất cho một lớp và tôi bị kẹt. Tôi muốn rút ra tất cả các thuộc tính áp dụng cho một lớp nhất định (bao gồm cả các thuộc tính được thừa hưởng từ các lớp bậc trên), ngoại trừ các thuộc tính đó có các giá trị con trong tập hợp kết quả.SPARQL: Nhận "tài sản cụ thể nhất"

Ví dụ, nếu tôi có một lớp Dân với một trong những thuộc tính của nó là atLocation, và một lớp con của Dân gọi tị nạn. Người tị nạn có một tài sản hiện tạiLocation, là một Thuộc tính con của tại Vị trí.

Vì vậy, những gì tôi muốn là một truy vấn chung chung rằng sẽ cho tôi chỉatLocation nếu tôi đặt trong Dân, và chỉcurrentLocation nếu tôi đặt trong tị nạn. Những gì tôi có điều này là:

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

SELECT DISTINCT ?prop WHERE { 
    ex:Refugee rdfs:subClassOf* ?domain . 
    ?prop rdfs:domain ?domain . 
    ?subprop rdfs:domain ?domain . 
    FILTER NOT EXISTS { ?subprop rdfs:subPropertyOf ?prop . } 
} ORDER BY ?prop 

này mang lại cho tôi cả atLocationcurrentLocation, mặc dù.

Điều này có thể thực hiện được trong một truy vấn không? Bất kỳ ý tưởng về cách giải quyết này đánh giá cao!

+1

Cùng một câu hỏi cũng được đăng (và trả lời) trên danh sách gửi thư của W3C sparql-dev, xem http://lists.w3.org/Archives/Public/public-sparql-dev/2012JulSep/0017.html –

Trả lời

4

Điều này phức tạp hơn tôi dự đoán khi tôi tự mình thử. Tuy nhiên, những gì bạn cần làm là mở rộng mệnh đề NOT EXISTS của bạn một chút.

SELECT ?prop WHERE { 
    ?prop rdfs:domain ?domain . 
    ?class rdfs:subClassOf* ?domain . 
    FILTER NOT EXISTS { 
     ?sub rdfs:subPropertyOf ?prop. 
     ?sub rdfs:domain ?d. 
     ?class rdfs:subClassOf* ?d . 
    } 
    FILTER (?class = ex:Refugee) 
} 

Chúng tôi đang chọn tất cả các thuộc tính có tên miền là ví dụ: người tị nạn hoặc một lớp cha của ví dụ: người tị nạn (hai BGPs đầu tiên). Nhưng sau đó chúng tôi muốn lọc ra các thuộc tính mà SubProperty tồn tại cũng có miền là (một lớp của) ex: Người tị nạn. Lưu ý rằng chúng tôi đang sử dụng biến số khác nhau cho tên miền của thuộc tính phụ (? D), sau khi tất cả nó không nhất thiết phải có cùng tên miền với thuộc tính chúng tôi đang chọn.

Các công trình trên đơn giản (không có entailment hoặc RDF (S) entailment) triplestore, miễn là mỗi thuộc tính phụ chỉ có tên miền cụ thể nhất định nghĩa là bạn có tên cũ: rdfs: tên miền cũ: Người tị nạn 'nhưng không rõ ràng' ví dụ: currentLocation rdfs: tên miền cũ: Dân số '.

+0

Cảm ơn, Jeen. Tôi vừa định dán câu trả lời của bạn ở đây, trong trường hợp người khác có cùng một vấn đề trong tương lai. – Carsten

+0

@Carsten, bạn không nghĩ rằng tôi sẽ cho phép bạn thoát khỏi những điểm nghiệp đó đúng không? :) –

Các vấn đề liên quan