2013-03-13 18 views
6

Tôi đang cố gắng khám phá xem tôi có tài nguyên cụ thể trong mô hình hay không. Đối với điều tôi đang sử dụng:Jena - Làm cách nào để biết liệu một tài nguyên cụ thể có nằm trong mô hình không?

model.getResource("example") 

Kiểm tra tài liệu, phương thức này hoạt động chính xác như createResource. Sau đó, ngay cả khi nó không có trong mô hình, tôi sẽ nhận được một nguồn tài nguyên mới.

Làm cách nào để kiểm tra xem tôi có tài nguyên để tránh tạo tài khoản khi không?

Cảm ơn trước!

+0

có thể liên kết này [Mô hình giao diện] (http://jena.apache.org/documentation/javadoc/jena/com/hp/hpl/jena/rdf/model/Model.html) rất hữu ích. –

+1

Sau khi nghiên cứu một chút, tôi đã tìm thấy cách tiếp theo. Tôi không biết đây có phải là cách tốt nhất để đạt được nó hay không, nhưng hoạt động: Tài nguyên toSearch = ResourceFactory.createResource ("example"); nếu (! Model.containsResource (toSearch)) ...; – jevora

+1

Nếu nó được giải quyết sau đó gửi một câu trả lời và chấp nhận nó, vì vậy người tiếp theo với cùng một vấn đề sẽ tìm thấy câu trả lời, bạn cũng nhận được một huy hiệu! :) – Boaz

Trả lời

11

Trong Jena, Resource đối tượng tự không trong mô hình. Mô hình chỉ chứa bộ ba - Statement đối tượng chứa chủ đề, vị từ và đối tượng (thường là chữ viết tắt SPO). Bất kỳ một trong S, P hoặc O có thể là một nguồn tài nguyên (lưu ý rằng Property là một loại phụ của Resource trong Jena và trong tiêu chuẩn RDF). Vì vậy, bạn cần phải tinh chỉnh câu hỏi của mình từ "mô hình này có chứa tài nguyên này" hay không:

  • Mô hình M có chứa tài nguyên R làm chủ đề không?

  • mô hình M có chứa tài nguyên R làm chủ đề, vị từ hoặc đối tượng không?

này có thể đạt được như:

Resource r = ... ; 
Model m = ... ; 

// does m contain r as a subject? 
if (m.contains(r, null, (RDFNode) null)) { 
    .. 
} 

// does m contain r as s, p or o? 
if (m.containsResource(r)) { 
    .. 
} 

Ngẫu nhiên, trong mẫu mã của bạn, bạn có

model.getResource("example") 

này trả về một đối tượng Resource tương ứng với URI nhất định, nhưng không làm phụ -Hiệu quả gấp ba trong mô hình. Đây là lý do mà Model có cả hai getResourcecreateResource - có khả năng có hiệu quả hơn một chút vì nó tái sử dụng các đối tượng tài nguyên, nhưng ngữ nghĩa về cơ bản là giống hệt nhau. Tuy nhiên, đối số bạn chuyển đến getResource hoặc createResourcephải là URI. Bạn đang vay rắc rối từ tương lai nếu bạn bắt đầu sử dụng thẻ như "example" thay cho URI đầy đủ, vì vậy tôi khuyên bạn nên dừng thói quen xấu này trước khi bạn cảm thấy thoải mái với nó!

+0

Cảm ơn bạn rất nhiều. Đó chắc chắn là giải pháp.Về thói quen xấu, đừng lo lắng, trong sự phát triển của tôi, tôi đang sử dụng các URI thực. Tôi chỉ sử dụng "ví dụ" bởi vì nó không quan trọng thời gian này. – jevora

+0

Kiểm tra giải pháp: có một số chứa phù hợp với r, null, null. Tôi muốn đề xuất: model.contains (tài nguyên, null, (RDFNode) null) – jevora

+0

Bắt tốt. Vâng, đó là một nỗi đau rằng chữ ký của phương thức cho 'contains()' là đủ tự do để yêu cầu một đối số 'đối tượng', nhưng đó là một quyết định thiết kế đã được thực hiện từ lâu trong lịch sử ban đầu của Jena và sẽ gây rối để thay đổi ngay bây giờ. –

2

Sau khi nghiên cứu một chút, tôi đã tìm thấy cách tiếp theo. Tôi không biết nếu điều này thực sự là cách tốt nhất để đạt được điều đó, nhưng hoạt động:

Resource toSearch = ResourceFactory.createResource("example"); 
if(!model.containsResource(toSearch))...; 
+0

Đây là câu trả lời đúng nhưng tôi phải đợi 2 ngày để đánh dấu nó là đúng – jevora

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