2012-01-29 8 views
7

Có thể tìm hiểu xem hai trường hợp là của cùng lớp, lập trình (Sử dụng api như JENA)Có thể tìm hiểu xem hai cá thể có cùng một lớp RDF, theo lập trình không?

+0

Bạn có thể sử dụng các phương pháp Java thuần túy không? – Jivings

+2

Tại sao chọn Jena? Bạn có thể dễ dàng lấy '.class' của hai đối tượng và so sánh chúng. –

+2

Tôi không nghĩ rằng câu hỏi liên quan đến các cá thể và các lớp Java, mà là các cá thể và lớp RDF/OWL. – user205512

Trả lời

8

dễ dàng trong SPARQL:

ASK { <instance1> a ?class . <instance2> a ?class . } 

Trong API Jena:

boolean shareClass = false; 
for (Statement s: instance1.listProperties(RDF.type)) { 
    if (instance2.hasProperty(RDF.type, s.getObject()) { 
     shareClass = true; 
     break; 
    } 
} 

Chưa có ry thanh lịch.

+0

+1, chỉ trả lời không nằm ngoài chủ đề hoặc bây giờ – ysdx

+0

Bây giờ SPARQL 1.1 có đường dẫn thuộc tính, truy vấn SPARQL đơn giản hóa thành 'ASK {? Class^a , }'. Nó nắm bắt rất tốt "là có một lớp trong đó cả hai instance1 và instance2 là trường hợp?" –

0

Hãy so sánh các lớp học của họ:

boolean same = obj1.getClass().equals(obj2.getClass()); 
+0

+1: '==' cũng có thể được sử dụng. –

+1

OP không rõ 100% về vấn đề này, nhưng câu hỏi có thể liên quan đến các lớp và các cá thể RDF/OWL, chứ không phải so sánh lớp Java. –

4

Giả sử bạn đang sử dụng API bản thể luận Jena, nó khá đơn giản. Lưu ý rằng trong RDF, một cá thể cụ thể có thể có nhiều loại, vì vậy câu hỏi của bạn thực sự là "làm cách nào tôi có thể kiểm tra xem hai cá thể có một hoặc nhiều loại chung không?".

Tôi sẽ làm như sau. Giả sử hai trường hợp bạn muốn kiểm tra là Individual đối tượng (lưu ý rằng bạn có thể làm điều này với OntResource, hoặc thậm chí Resource với một thay đổi nhỏ trong mã):

Individual i0 = ....; 
Individual i1 = ....; 

Danh sách các rdf:type giá trị cho mỗi, và chuyển đổi chúng để bộ

Set<Resource> types0 = i0.listRDFTypes(false).toSet(); 
Set<Resource> types1 = i1.listRDFTypes(false).toSet(); 

Họ có các loại điểm chung nếu ngã tư không bị để trống:

types0.retainAll(types1); 
if (!types0.isEmpty()) { 
    // at least one type in common 
    // types0 contains the common type resources 
} 
+0

Điều đó dễ chịu hơn. Ổi có 'Sets.intersection' sẽ dễ đọc hơn. Typo: '... types1 = i1.listRDFTypes ...' – user205512

+0

Cảm ơn, lỗi đánh máy đã sửa –

+0

Xin chào, tôi vẫn còn chút nhầm lẫn. Hy vọng bạn có thể làm rõ điều đó. Như bạn đã đề xuất, tôi có các loại và so sánh giao lộ của chúng. Vấn đề là: đối với các cá thể của hai lớp khác nhau, 'listRDFTypes' vẫn trả về' [http://www.w3.org/2002/07/owl#Class] 'làm kiểu. Kết quả là, bất kỳ hai trường hợp nào tôi lấy đều có cùng loại. Tui bỏ lỡ điều gì vậy? – PCoder

-1

tôi mang nó thứ là một tiện ích mở rộng cho bài đăng trước đó của bạn để

if (resource1.hasProperty(model.createProperty("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "type"), model.createResource("http://typeUri")) && resource2.hasProperty(model.createProperty("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "type"), model.createResource("http://typeUri"))) { 
    // both resources are the same type 
}