Trong chương này, chúng tôi cung cấp một vài ví dụ, từ HelloWorld, đến các thao tác cơ bản mà bạn có thể sẽ gặp phải đối với bất kỳ các ứng dụng trênSemantic Web, bao gồm cả các hoạt độn
Trang 1Chapter 15: Sử dụng Jena để phát triển Web ngữ nghĩa
Một phần của chương trước đã trình bày tổng quan về các frameworkphát triển có sẵn Chương này tập trung vào Jena là một ví dụ cụ thể cũng nhưmôi trường phát triển chính của chúng tôi
Trong chương này, chúng tôi cung cấp một vài ví dụ, từ HelloWorld, đến
các thao tác cơ bản mà bạn có thể sẽ gặp phải đối với bất kỳ các ứng dụng trênSemantic Web, bao gồm cả các hoạt động của mô hình RDF, xử lý đồ thị RDF
và khả năng suy luận Mục tiêu không phải chỉ để chỉ ra cách sử dụngframework phát triển Jena, mà còn bổ sung các classes Java vào bộ công cụriêng của bạn, và tái sử dụng chúng trong công tác phát triển trong tương lai củabạn
Lưu ý Jena là một API cho các ứng dụng Java Web ngữ nghĩa Do đóchương này giả định rằng bạn đã quen thuộc với ngôn ngữ lập trình Java
15.1 Jena: A Semantic Web Framework for Java
15.1.1 What Is Jena and What Can It Do for Us?
Tại thời điểm này, chúng tôi chưa phát triển các ứng dụng trên SemanticWeb Tuy nhiên, dựa vào những gì chúng ta đã học về Semantic Web, chúng tanhận ra rằng bất kỳ ứng dụng Web có ngữ nghĩa có thể xử lý các tác vụ thôngthường như sau:
• Đọc / phân tích các tài liệu RDF
• Viết / tạo các tài liệu RDF
• Định vị / tìm kiếm thông qua một đồ thị RDF
• Truy vấn một bộ dữ liệu RDF bằng SPARQL
• Suy luận sử dụng các ontology OWL
Để có thể sử dụng Jena API, bước đầu tiên là tải về các gói Jena, và bướcthứ hai là để thiết lập một môi trường phát triển Java để sử dụng các gói
Trang 2Jena Hai bước này được trình bày chi tiết trong phần này Môi trường phát triểnJava được sử dụng là Eclipse.
15.1.2 Getting the Jena Package
Truy cập đường link (http://jena.apache.org/) để đến trang chủ Jena
Để tải về các gói Jena, nhấp vào liên kết tải về trên trang web, và làmtheo hướng dẫn Phiên bản sử dụng ở đây là bản 2.6.0, tuy nhiên các phiên bảncao hơn đều có thể sử dụng được
Sau khi tải về xong, bạn sẽ tìm thấy một tập tin zip có tên Jena-2.xx trên
ổ cứng Giải nén tập tin này để tạo ra một thư mục gói Jena trên ổ cứng củabạn Lưu ý rằng Jena là một thư viện để viết các ứng dụng dựa trên RDF và tàiliệu OWL Nó chỉ được sử dụng trong lập trình như là một tập hợp các APIs, vàkhông có giao diện đồ họa cho Jena Các thành phần cốt lõi của Jena được lưutrữ trong thư mục \lib
Để sử dụng các thư viện Jena, cần phải thêm tất cả các file jar liên quan
vào biến classpath.
Ví dụ đối với Windows XP, các biến classpath được chứa trong hai loại: loại SystemVariables và loại UserVariables Thông thường chỉ cần thay đổi giá trị biến UserVariables là đủ.
Để làm như vậy, nhấp chuột phải vào biểu tượng My Computer, nhấp chọn vào Properties, để hiện ra cửa sổ System Properties Trong cửa sổ này, click vào tab Advanced, và sau đó nhấp vào nút Environment Variables, trong
đó sẽ đưa bạn đến cửa sổ nơi bạn có thể chỉnh sửa các biến classpath chứa trong loại UserVariables.
15.1.3 Using Jena in Your Projects
Sau khi thiết lập môi trường Jena, cần phải tích hợp các gói Jena vào cácEclipse project để sử dụng được framework Jena
Trang 315.1.3.1 Using Jena in Eclipse
Sự khác biệt giữa một project thuần Java và một project Java sử dụng thưviện Jena đó là Eclipse cần biết đường dẫn để tìm các tập tin thư viện Jena đểtham chiếu đến Khi đó, nó có thể tải các class tương ứng từ thư viện để sử dụngtrong các project
Một cách để thực hiện điều này là để tạo ra một thư mục \lib trong projectworkspace, sao chép các tập tin thư viện Jena vào thư mục \lib này và sau đó bổsung thư mục \lib này vào đường dẫn để build project
Tuy nhiên, một giải pháp khác có thể được sử dụng đó là tạo thư việnngười sử dụng (user library)
Trong Eclipse, một thư viện người sử dụng một thư viện do người dùng
tự định nghĩa (một tập hợp các files jar) và có thể sử dụng cho nhiều projectkhác nhau Việc cập nhật phiên bản Jena cũng đơn giản hơn vì chỉ cần phải cậpnhật user library
Để cấu hình một user library, mở Eclipse và chọn Window từ thanh công
cụ Chọn Preferences Từ cửa sổ mở ra, chọn Java ở menu bên trái, và chọn Build Path Khi Build Path được mở, chọn User Libraries như hình 15.1.
Bấm New để tạo một user library mới, nhập jena làm tên thư viện, và nhấn OK Sau đó, nhấn vào Add JARS, trỏ đến thư mục chứa các file jar trong thư mục \lib Nhấn Open, và user library đã được tạo ra.
Hình 15.1 Thiết lập khuôn khổ Jena như một thư viện sử dụng trongEclipse
Trang 415.1.3.2 HelloWorld! from a Semantic Web Application
Chúng ta sẽ thực hiện ví dụ HelloWorld để khảo sát việc xây dựng một
project sử dụng framework Jena cho Semantic Web
Ví dụ HelloWorld như sau: chúng ta sẽ tạo ra một tài liệu RDF đơn giản
đó chỉ chứa một tài liệu RDF, khai báo như sau:
subject: http://example.org/test/message
property: http://example.org/test/says
object: Hello World!
Khởi động Eclipse, tạo một project mới là HelloWorld, tạo một class tên HelloWorld.java.
Nhập vào đoạn code bên dưới (Hình 15.1)
1: public class HelloWorld {
2:
3: static private String nameSpace = "http://example.org/test/";
4:
5: public static void main(String[] args) {
6: Model model = ModelFactory.createDefaultModel();
7:
8: Resource subject =
Trang 58a: model.createResource(nameSpace + "message");
Trang 6Hình 15.3 Sử dụng framework Jena như một user library
Sau khi nhập đoạn code, Eclipse sẽ báo lỗi Ví dụ, nó không nhận
ra Model, ModelFactory, Resource và Property Rõ ràng, những định nghĩa này
đã có trong Jena, tuy nhiên Eclipse vẫn chưa nhận ra Bây giờ chúng ta cần phảichỉ cho Eclipse rằng các thư viện dùng chúng ta vừa tạo ra có chứa các địnhnghĩa rằng nó cần; chúng ta làm điều này bằng cách thêm các user library đểbuild project
Để làm điều đó, nhấp chuột phải vào HelloWorld project trong cửa sổ
Project Explorer, chọn Properties, tìm đến Java Build Path và chọn
tab Libraries (Hình 15.3).
Chọn Add Library để hiện cửa sổ như hình 15.4.
Chọn User Library, và nhấn Next; chọn jena và nhấn Finish để thêm user
library như trong hình 15.5
Nhấn OK trong cửa sổ Properties for HelloWorld để hoàn thành Bạn có thể thấy thư viện jena đã xuất hiện trong cửa sổ Project Explorer.
Trang 7Tuy nhiên, lỗi vẫn còn hiển thị Thực tế, Eclipse chờ chúng ta sử dụng
các khai báo import thích hợp để nó có thể tìm thấy các định nghĩa cho các lớp Model, ModelFactory, Resource và Property như ở Hình 15.2
Hình 15.4 Sử dụng framework Jena như một user library (cont.)
Hình 15.5 Sử dụng framework Jena như một user library (bước cuối
cùng)
Trang 8Hình 15.2 Import statements in our HelloWorld project
Trang 915.2 Basic RDF Model Operations
Trong phần này, chúng ta sẽ sử dụng Jena để thực hiện một số chức năng
cơ bản, đơn giản là tạo các mô hình RDF trong bộ nhớ hoặc đọc vào bộ nhớ từcác URL hay file hệ thống
15.2.1 Creating an RDF Model
Trong phần này, chúng tôi tạo ra một mô hình RDF từ đầu và sau đóthêm các các khai báo cho nó Để đơn giản, chúng ta sẽ tạo mô hình biểu diễnFOAF, như trong Hình 15.5
Hình 15.5 The author’s FOAF document
Trang 1021a: rdf:resource="http://www.ilrt.bris.ac.uk/~ecemm/"/> 22: </foaf:Person>
Và mã nguồn như trong Hình 15.6
Hình 15.6 Create a new RDF model and add statements to it
Trang 1113: Model model = ModelFactory.createDefaultModel();
24a: model.createResource("http://www.liyangyu.com")); 25: subject.addProperty(FOAF.workplaceHomepage,
25a: model.createResource("http://www.delta.com")); 26: subject.addProperty(FOAF.topic_interest,
Trang 12Trong Jena, các class biểu diễn như sau:
• Class Literal biểu diễn tân ngữ
Để tạo chủ ngữ, gọi hàm createResource() (dòng 17) Hàm truyền vào
URI như định danh
Để tạo thuộc tính cho đối tượng, gọi hàm Resource.addProperty() (từ
dòng 19-27) Hàm này truyền vào hai tham số: tên thuộc tính và giá trị thuộctính
Trong trường hợp Jena không hỗ trợ FOAF, dòng 19 có thể được viết lạinhư sau:
Trang 13(model.createProperty("http://xmlns.com/foaf/0.1/name"),
"liyang yu");
Như vậy chúng ta đã hoàn tất việc tạo mô hình RDF Tiếp theo chúng ta
sẽ chạy chương trình để kiểm tra kết quả
Cho chạy class java này, bạn sẽ nhận được các kết quả như trong Hình15.7
Trang 14RDF/XML-model.write(new PrintWriter(System.out), "RDF/XML-ABBREV");Chạy chương trình một lần nữa, và bạn sẽ thấy những kết quả như trongHình 15.8.
Hình 15.8 A better output generated from Hình 15.6
Trang 15So với việc tạo ra một mô hình RDF, việc đọc một tài liệu RDF đưa vào
bộ nhớ là một hoạt động thường xuyên hơn Trước khi thao tác trên RDF, cầnphải đọc nó từ một địa chỉ URL cho trước nào đó, và lưu nó vào bộ nhớ
Đoạn mã của hoạt động đọc như Hình 15.9, đọc tài liệu FOAF từ URLhttp://liyangyu.com/foaf.rdf, và để hiển thị một cách chính xác, nó được lưu lạidưới định dạng Turtle
Hình 15.9 Reading an RDF document from a given URL
Trang 16Hình 15.10 cho kết quả khi chạy đoạn mã trên.
Hình 15.10 Output generated from Hình 15.9
] ;
foaf:mbox_sha1sum
"1613a9c3ec8b18271a8fe1f79537a7b08803d896"@en ; foaf:name "liyang yu"@en ;
Trang 17foaf:title "Dr"@en ; foaf:topic_interest
<http://dbpedia.org/resource/Semantic_Web> ; foaf:workplaceHomepage
<http://www.delta.com>
Cũng có thể load một tài liệu RDF vào bộ nhớ từ một file hệ thống Để
làm điều này, ta sử dụng class FileManager như Hình 15.11
Hình 15.11 Read an RDF document from local file system
Trang 1931: // show all the classes and their instances
32: System.out.println("the following types/classes have
32a: been used in this RDF document(with their instances):");
39: Resource instanceRes = resources.nextResource(); 40: if ( instanceRes.isAnon() ) {
41: System.out.println(" [anonymous instance] " + 41a: instanceRes.getId());
Trang 2049: }
Dòng 15 xác định URL của các tài liệu RDF chúng ta muốn đọc, và dòng
19 và 20 thực hiện việc đọc các tài liệu RDF vào bộ nhớ của mô hình Dòng
23-29 hiển thị tất cả các namespaces (và các prefixes) đã được sử dụng trong tàiliệu Hàm getNsPrefixMap() (dòng 24) trả về một tập các cặp key-value; đối vớimỗi cặp, key là các prefixes và value là namespaces Như bạn thấy, dòng 27 vàdòng 28 sẽ in các prefixes và namespaces
Để tìm tất cả các kiểu/class được tham chiếu trong mô hình này,
hàm ListObjectsOfProperty() được sử dụng (dòng 33) Hàm này sử dụng một
thuộc tính (property) như tham số đầu vào của nó (trong trường hợp này,property này là RDF.type):
subject rdf:type object
Sau khi thực hiện, hàm ListObjectsOfProperty() trả về một nhóm các lớp.
Để tìm tất cả các resources của mỗi lớp, ta sử dụng
hàm ListResourcesWithProperty() như dòng 37 Hàm này có hai tham số truyền
vào là thuộc tính và loại đối tượng, và trong trường hợp này, RDF.type là thuộctính và typeRes là đối tượng Nó sẽ tìm các trường hợp có dạng như sau:
subject rdf:type typeRes
Khi được tìm thấy, hàm sẽ trả về các resources Dòng 38-44 sẽ hiển thị tất
cả các resources
Lưu ý rằng một số resource có thể trống (blank) Để kiểm tra điều này, cóthể sử dụng hàm isAnon() (dòng 40) Nếu resource biểu diễn một node trống, tadùng getId() được gọi để lấy định danh của nó; nếu không, có thể sử dụnghàm getURI() (dòng 43)
Chạy đoạn mã và cho ra kết quả như Hình 15.13
Hình 15.13 Output generated from Hình 15.12 with the author’s FOAFdocument
Trang 211: prefix:rdfs, namespace:http://www.w3.org/2000/01/rdf-schema#
2: prefix:rdf, 2a: namespace:http://www.w3.org/1999/02/22-rdf-syntax-ns#
3: prefix:foaf, namespace:http://xmlns.com/foaf/0.1/
4: the following types/classes have been used in this RDF 4a: document (with their instances):
5: (class/type) http://xmlns.com/foaf/0.1/Person 6: [anonymous instance] -6aa9a0b:12454881133:-8000 7: [instance] http://www.liyangyu.com/foaf.rdf#liyang
Như bạn có thể thấy, dòng 1-3 hiển thị các prefixes và namespaces, dòng
5 hiển thị class duy nhất (foaf: Person) được sử dụng trong tài liệu này, và dòng
6 và 7 là hai trường hợp của class đó
Chúng ta có thể thử một số file khác có nhiều nội dung hơn tài liệu FOAFtrên Ví dụ,
http://dbpedia.org/data/Roger_Federer.rdf
Bạn cần thay đổi dòng 15 của Hình 15.12 như sau:
public static final String RDF_FILE =
"http://dbpedia.org/data/Roger_Federer.rdf";
Hình 15.14 cho thấy một phần của kết quả
Hình 15.14 Understanding Federer’s RDF document generated byDbpedia
Trang 22(class/type) http://dbpedia.org/class/yago/AustralianOpenChampions [instance] http://dbpedia.org/resource/Roger_Federer (class/type) http://dbpedia.org/ontology/Athlete [instance] http://dbpedia.org/resource/Roger_Federer (class/type) http://dbpedia.org/ontology/TennisPlayer [instance] http://dbpedia.org/resource/Roger_Federer (class/type) http://dbpedia.org/class/yago/LivingPeople [instance] http://dbpedia.org/resource/Roger_Federer (class/type) http://xmlns.com/foaf/0.1/Person [instance] http://dbpedia.org/resource/Roger_Federer
Dựa trên kết quả này, cho dù không đọc các tài liệu RDF này, chúng tôi
đã thu được khá nhiều thông tin về nó đã Bên cạnh đó sự hiểu biết các loạithông tin cho các nguồn tài nguyên, chúng ta cũng có thể kiểm tra các thuộctính xác định cho nó Trong số tất cả các thuộc tính, sau ba là mối quan tâm đặcbiệt đến với chúng tôi:
Trang 2435: // show all the classes and their instances
51:
52: // show all instances that have a owl:sameAs property 53: System.out.println("\nfollowing instances have
53a: owl:sameAs property:");
54: StmtIterator statements = model.HìnhStatements
54a: ((Resource)null,OWL.sameAs,(RDFNode)null); 55: while ( statements.hasNext() ) {
56: Statement statement = statements.nextStatement(); 57: Resource subject = statement.getSubject();
58: if ( subject.isAnon() ) {
59: System.out.print(" (" + subject.getId() + ")"); 60: } else {
Trang 25Hàm sư dụng ở đây là HìnhStatements() như trên dòng 54 Ta truyền giátrị null cho cả subject và object, do đó kết quả tìm được đều liên quan đến truyvấn owl:sameAs.
Bây giờ chạy lại đoạn code, và chúng ta sẽ thấy kết quả như trong Hình15.16
Hình 15.16 Part of the output from Hình 15.15
the following instance(s) has/have owl:sameAs property:
(http://dbpedia.org/resource/Roger_Federer) OWL.sameAs (http://rdf.freebase.com/ns/guid.9202a8c04000641f800000000019f52) (http://mpii.de/yago/resource/Roger_Federer) OWL.sameAs
(http://dbpedia.org/resource/Roger_Federer)
15.3 Handling Persistent RDF Models
15.3.1 From In-Memory Model to Persistent Model
Cho đến thời điểm này, chúng tôi đã được làm việc với bộ nhớ trong môhình Những mô hình này được tạo ra từ đầu, hoặc là từ các tập tin phổ biếnhiện có Các tập tin có thể được đặt trong một hệ thống tập tin địa phương, hoặc
có thể được tải về từ các URL nhất định
Mặc dù trong bộ nhớ mô hình là khá hữu ích, họ có một số nhượcđiểm Một vài điểm:
• Các mô hình RDF có được repopulated từ đầu mỗi khi khởi chạy ứngdụng, do đó đòi hỏi một thời gian khởi động lâu hơn
• Bất kỳ thay đổi được thực hiện cho các mô hình trong bộ nhớ sẽ bị mấtkhi ứng dụng được đóng cửa
• Các ứng dụng dựa trên bộ nhớ trong mô hình sẽ không quy mô nhưchúng tôi bắt đầu làm việc với các mô hình lớn hơn