Tải bản đầy đủ (.pdf) (92 trang)

Ultimate mashup – Các dịch vụ Web và Web ngữ nghĩa, Phần 5 potx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (475.64 KB, 92 trang )


Ultimate mashup – Các dịch vụ Web
và Web ngữ nghĩa, Phần 5: Thay đổi
các dịch vụ Web
Tóm tắt: Loạt bài viết này trình bày chi tiết việc tạo ra một ứng dụng Mashup
cho phép kiểm soát các dữ liệu được hiển thị với người sử dụng. Bây giờ bạn biết
làm thế nào để tạo một bản thể luận (ontology) để xác định khái niệm đại diện của
một dịch vụ, bạn có thể cho phép người dùng lựa chọn dịch vụ mà họ muốn sử
dụng
Trước khi bắt đầu
Đây là bài viết cho các nhà phát triển, những người muốn tìm hiểu làm thế nào để
sử dụng một bản thể luận dùng API - cụ thể, trong trường hợp này, là Jena API -
cũng như những người chỉ muốn xem làm thế nào các bản thể luận và các xử lý
ngữ nghĩa khái niệm khác có thể hữu dụng trong một thế giới ứng dụng thực sự.
Nó sử dụng các bản thể luận của bạn trong phần 3 và 4 và tích hợp vào Mashup
bạn xây dựng trong phần 1, nhằm cung cấp cho người dùng một sự lựa chọn về
các dịch vụ sử dụng
Bài viết này giả định rằng bạn đã quen với khái niệm về XML, khung mô tả tài
nguyên (Resource Description Framework - RDF), các bản thể luận, và ngôn ngữ
bản thể luận Web (Web Ontology Language - OWL). Nó cũng sử dụng các ngôn
ngữ lập trình Java, nhưng nếu bạn chỉ tìm kiếm một khái niệm hoặc chỉ tìm hiểu
nó làm việc như thế nào, điều đó là không quan trọng. Nếu bạn cần một bất cứ
điều gì trong các khái niệm này (trừ Java, tất nhiên) hãy xem các phần trước. Bạn
có thể tìm thấy các liên kết với chúng (và các nguồn cho Java) trong Tài nguyên.
Về loạt bài viết này
Ngày nay, có vẻ như bạn không thể lướt trên Web mà không sử dụng một trang
Web mà trang đó hoặc có thể cung cấp quyền truy cập vào dữ liệu của nó thông
qua một dịch vụ dựa trên API hoặc sử dụng dữ liệu từ một trang web khác lấy
được thông qua một dịch vụ dựa trên API. Khi bạn xem xét các lợi thế của việc sử
dụng các thông tin hiện có trong các ứng dụng của riêng bạn, có lẽ không đáng
ngạc nhiên lắm. Nó cũng chỉ là vấn đề ở thời gian trước khi một người bắt đầu kết


hợp dữ liệu từ các hệ thống riêng biệt để tạo ra những gì hoàn toàn mới. Những
ứng dụng, được gọi là mashup, là khu vực mới nhất trên Web, từ các trang web
dựa trên cộng đồng đến các trang web chuyên tìm kiếm, thậm chí các ánh xạ
mashup hiện nay.
Chúng hầu hết đều hữu dụng, nhưng có một điểm chung là được phát triển cho các
thiết lập dịch vụ cụ thể. Nếu ưu tiên cho một loại dịch vụ cụ thể thay đổi, bạn sẽ có
rất nhiều việc phải làm.
Mục đích của các bài viết này là tạo ra các ứng dụng mashup đủ thông minh để
người dùng có thể bổ sung hoặc loại bỏ các tiện ích nếu muốn, và hệ thống sẽ biết
phải làm gì với chúng. Được tiến hành như sau:
Phần 1 giới thiệu các khái niệm về các mashup, trình bày cách hoạt động của
chúng và xây dụng các phiên bản đơn giản
Phần 2 giải quyết một phần của vấn đề bằng cách sử dụng các khả năng
pureXML™ mới của IBM® DB2® để xây dựng một vùng nhớ đệm XML, cái cho
phép bạn lưu các yêu cầu trước đó đồng thời cho phép truy hồi các thông tin cụ
thể.
Sau cùng, bạn cần sử dụng các bản thể luận hoặc các từ định nghĩa cho các khái
niệm hoặc thuộc tính liên quan, nên ở Phần 3 quy trình bắt đầu bằng việc tìm hiểu
về RDF và RDFS, hai thành phần chính của OWL, sẽ được đề cập ở phần 4. Ở
phần 5, bạn sẽ dùng đến các bản thể luận đã tạo ở phần 4 và dùng chúng để cho
phép người dùng thay đổi nguồn thông tin.
Phần 6, thực sự thú vị. Ở đây, bạn cung cấp cho người sử dụng quyền kiểm soát,
và cho phép họ sắp xếp các dịch vụ mới vào bản thể luận và lựa chọn các dữ liệu
được sử dụng để tùy chỉnh một Mashup.


Về bài viết này
Các phần trước đã giải thích thế nào là mashup, và bạn làm thế nào để sử dụng
chúng cho việc tổ hợp dữ liệu từ nhiều nguồn. Mục đích là cung cấp một hệ thống
thông minh, chẳng hạn như khả năng chuyển đổi từ dịch vụ này ra dịch vụ khác

mà không cần phải biết chính xác thông tin được thể hiện như thế nào trước đó. Để
làm điều đó, bạn sẽ cần phải định nghĩa các khái niệm như "hiệu sách", "DVD",
"giá cả", v.v
Trong các phần trước, bạn đã xây dựng một ứng dụng mashup cho phép người
dùng đưa ra yêu cầu về thông tin trên các chủ đề cụ thể hoặc từ khóa. Tại bài viết
này, bạn sẽ biết cách cho phép người dùng lựa chọn dịch vụ để sử dụng cho dữ
liệu.
Trong bài viết này, bạn sẽ được học:
 Tải về và thao tác trên một bản thể luận
 Trích dẫn các cá thể từ một bản thể luận bằng cách lập trình
 Tiếp cận các đặc tính và các giá trị từ một bản thể luận hoặc một tài liệu
RDF
 Chuyển đổi một kết quả dạng bắc cầu REST sang một cá thể dạng bản thể
luận tổng quát
 Hiển thị thông tin bản thể luận ở dạng HTML
Trong bài viết này, bạn sẽ mã hóa thông tin về các dịch vụ cá nhân trong một tập
tin Owl. Sau đó, bạn sẽ sử dụng Jena API để trích xuất thông tin đó và sử dụng nó
để thực hiện một yêu cầu REST. Cuối cùng, bạn chuyển đổi phản hồi REST vào
hình thức chung, và hiển thị nó trên trang HTML như trước.


Các điều kiện tiên quyết
Bạn sẽ phải thực hiện việc cài đặt phần mềm dưới đây và kiểm tra nó nhằm theo
kịp với mã trong bài bài viết này.
 IBM® DB2® 9 (Trước đây thường được biết là "Viper"): Cơ sở dữ liệu
liên quan này cũng có các nhiều khả năng quan trọng của XML, thứ bạn sẽ
cần cho bài học này. Bạn có thể tải về một phiên bản dùng thử của DB2:
DB2 Enterprise 9 hoặc DB2 Express-C 9, một bản miễn phí dữ liệu máy
chủ DB2 Express 9.
 Apache Tomcat hoặc các máy chủ servlet: bài viết này giả định rằng bạn sẽ

xây dựng các ứng dụng web bằng cách sử dụng các servlet, do đó, bạn sẽ
cần một động cơ như là servlet Apache Tomcat. Nếu bạn chọn để xây dựng
ứng dụng này bằng cách sử dụng môi trường khác, chỉ cần đảm bảo rằng
bạn phải có sẵn phần mềm thích hợp. Tải về apache-tomcat-5.5.17.zip và
cài đặt vào một thư mục mà không có dấu cách trong tên của thư mục.
 Java: Apache Tomcat 5.5, cùng với nó thì bài viết này được xây dựng, nó
yêu cầu bản Java 1.5 hoặc cao hơn. Tải từ J2SE SDK.
 The Jena API: Jena API là Java API được thiết kế để làm việc với dữ liệu
RDF và OWL. Có thể tải về từ
 Để thuận tiện hơn, có thể dùng một IDE như Eclipse hoặc IBM Rational™
Web Developer đối với phát triển của bạn. Có thể tải Eclipse từ Eclipse.org
tải bản thử nghiệm Rational Web Developer, hoặc dùng môi trường phát
triển bạn yêu thích. Bạn không nên đi quá những gì mà lĩnh vực về biên
soạn và triển khai yêu cầu.
Tổng quan
Trước khi bạn bắt tay vào mã mới, bạn cần phải nhớ lại những gì loạt bài viết này
đã đề cập đến.
Bài viết trước: Xác định các dịch vụ
Tại thời điểm này, bạn có một ít mã chứa một ứng dụng làm việc, và có rất nhiều
khái niệm. Trong Phần 1, bạn đã tạo một ứng dụng bao gồm một Mashup cơ bản.
Người dùng nhập vào một từ khóa và một mẫu để gửi vào một servlet. Servlet cấp
từ khóa đó cho bất kỳ các dịch vụ đã được định nghĩa trong một lớp Service bất
kỳ. Đối với mỗi dịch vụ nói trên, bạn cần xử lý kết quả dựa vào các thông tin được
cung cấp trong khai báo tự xác định của dịch vụ. Ví dụ lớp Service xác định các
dịch vụ tin tức Yahoo trông sẽ như sau (xem ví dụ 1).

Ví dụ 1. Xác định một dịch vụ


Service thisService = new Service();

Service subService = new Service();

subService.name = "Technorati";
subService.baseURL =
" />
subService.template = "<span><value/></span>";
subService.elementValues[0] = "inboundlinks";
subService.elementValues[1] = "bogus";
subService.attributeValues[0] = "thumbnail_url";
subService.recordExp = "/tapi/document/result";


thisService.name = "Yahoo! Search";
thisService.baseURL =
"

"chService/V1/newsSearch?appid=mashupid&type=all&query=";

thisService.template = "<p><b><a
value='href'><value/></a>"+
"</b>: <value/> (Linked <subService/>
times)</p>";
thisService.elementValues[0] = "Title";
thisService.elementValues[1] = "Summary";
thisService.attributeValues[0] = "ClickUrl";
thisService.recordExp = "/ResultSet/Result";

thisService.subSvc = subService;
thisService.filterExp = "ClickUrl";



Lớp dịch vụ Service định nghĩa một cái tên và URL làm cơ sở cho các yêu cầu
REST. Khi bạn thực hiện các yêu cầu trong thực tế, bạn chỉ cần thêm từ khóa vào
phần cuối. Dịch vụ cũng xác định biểu thức XPath là đại diện cho vị trí của từng
cá thể bản ghi dữ liệu trong các kết quả. Trong ví dụ ở đây, /ResultSet/Result biểu
diễn cho mỗi một phần mới. Cuối cùng, dịch vụ bao gồm các thông tin cho biết
làm thế nào để hiển thị các kết quả dữ liệu. Các mẫu đại diện HTML cho đầu ra,
với các yếu tố giá trị và các thuộc tính phục vụ như phần giữ chỗ (placeholder) để
sẽ được thay thế bởi các dữ liệu được tìm thấy trong các biểu thức XPath trong các
mảng elementValues và các giá trị thuộc tính attributeValues.
Trong trường hợp này, bạn cũng có thể thấy phần gắn thêm của một dịch vụ thứ
hai và được thể hiện bởi thành tố dịch vụ con subservice.


Các bài viết trước: các tính năng tiên tiến
Trong Phần 2, bạn phát triển phần ứng dụng hơn là tạo ra một yêu cầu Web cho tất
các các yêu cầu dịch vụ - đây là một quá trình có thể kéo dài đến vài phút nếu
phần mashup tạo ra nhiều yêu cầu - bạn bắt đầu lưu giữ các kết quả yêu cầu trong
cơ sở dữ liệu XML có sử dụng khả năng pureXML mới của DB2. Điều này cho
phép bạn kiểm tra một cơ sở dữ liệu cho một yêu cầu cụ thể trước khi chạy
Mashup và tạo một cái mới.
Nhưng mục tiêu tổng quát là tạo ra một dịch vụ thông minh – với nó người sử
dụng có thể yêu cầu một kiểu dữ liệu cụ thể - như sách, giá và mashup sẽ hiểu
làm thế nào để tìm được cho dù vấn đề không phải là bạn sử dụng dịch vụ nào.
Để làm được điều này, ở Phần 3 và 4, bạn sẽ học cách tạo bản thể luận hoặc phân
loại các khái niệm. Bằng cách này, bạn có thể định nghĩa các khái niệm như cuốn
sách, giá cả,… để cung cấp một hình thức chung và sắp xếp từ đó bạn có thể xử lý
từng kiểu dịch vụ chứ không phải chỉ là từng dịch vụ.
Ở phần 4, bạn đã tạo ra một bản thể luận của hiệu sách có rất nhiều các khái niệm,
định nghĩa mà bạn có thể tìm thấy trong các hiệu sách điện tử, như sách, DVD,

cho rất nhiều khái niệm có thể được tìm kiếm từ các lưu trữ điện tử như sách,
DVD, tác giả ở phần hướng dẫn bạn có thể bắt đầu thêm vào các dữ liệu thực tế
cho bản thể luận này.


Bản thể luận cơ sở
Bản thể luận cở sở trông tương tự như sau (xem ví dụ 2).

Ví dụ 2. Bản thể luận cơ sở

<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [
<!ENTITY store " >
<!ENTITY owl " >
<!ENTITY xsd " >
]>

<rdf:RDF
xmlns = "
xmlns:store = "
xml:base = "
xmlns:owl = "
xmlns:rdf = "
xmlns:rdfs= "
xmlns:xsd = "
>

<owl:Ontology rdf:about=">
<rdfs:comment>An example OWL ontology for Online Bookstores (The
Ultimate Mashup: Part #4)</rdfs:comment>

<rdfs:label>BookStore Ontology</rdfs:label>
</owl:Ontology>

<owl:Class rdf:ID="Service">
<rdfs:label>Web Service</rdfs:label>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#endpoint" />
<owl:minCardinality
rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:DatatypeProperty rdf:ID="endpoint">
<rdfs:domain rdf:resource="#Service"/>
<rdfs:range rdf:resource="
</owl:DatatypeProperty>

<owl:Class rdf:ID="Store">
<rdfs:subClassOf rdf:resource="#Service"/>
<rdfs:label>Online Store</rdfs:label>
</owl:Class>

<owl:Class rdf:ID="Bookstore">
<rdfs:subClassOf rdf:resource="#Store"/>
<rdfs:label>Bookstore</rdfs:label>
</owl:Class>

<owl:Class rdf:ID="Product">
<rdfs:label>Product sold at online store</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="Book">
<rdfs:subClassOf rdf:resource="#Product"/>
<rdfs:label>Book</rdfs:label>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#writtenBy" />
<owl:minCardinality
rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>

<owl:DatatypeProperty rdf:ID="title">
<rdfs:domain rdf:resource="#Book"/>
<rdfs:range rdf:resource="&xsd;string"/>
</owl:DatatypeProperty>

<owl:Class rdf:ID="ISBN">
</owl:Class>
<owl:InverseFunctionalProperty rdf:ID="isbn">
<rdfs:domain rdf:resource="#ISBN"/>
<rdfs:range rdf:resource="#Book"/>
</owl:InverseFunctionalProperty>

<owl:Class rdf:ID="Movie">
<rdfs:subClassOf rdf:resource="#Product"/>
<rdfs:label>Movie</rdfs:label>
</owl:Class>


<owl:Class rdf:ID="Person">
<rdfs:label>Person</rdfs:label>
</owl:Class>
<owl:DatatypeProperty rdf:ID="name">
<rdfs:domain rdf:resource="#Person"/>
<rdfs:range rdf:resource="&xsd;string"/>
</owl:DatatypeProperty>

<owl:Class rdf:ID="Author">
<rdfs:subClassOf rdf:resource="#Person"/>
<rdfs:label>Author</rdfs:label>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#writerOf" />
<owl:minCardinality
rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Writer">
<owl:equivalentClass rdf:resource="#Author"/>
</owl:Class>


<owl:ObjectProperty rdf:ID="writtenBy">
<rdfs:domain rdf:resource="#Book"/>
<rdfs:range rdf:resource="#Author"/>
</owl:ObjectProperty>
<owl:ObjectProperty rdf:ID="writerOf">

<owl:inverseOf rdf:resource="#writtenBy"/>
</owl:ObjectProperty>
<owl:ObjectProperty rdf:ID="authorOf">
<owl:equivalentProperty rdf:resource="#writerOf"/>
</owl:ObjectProperty>

<owl:Class rdf:ID="Director">
<rdfs:subClassOf rdf:resource="#Person"/>
<rdfs:label>Director</rdfs:label>
</owl:Class>

<owl:Class rdf:ID="GenreList" />
<owl:Class rdf:ID="Genre" />
<Genre rdf:ID="Fiction"/>
<Genre rdf:ID="Nonfiction"/>
<Genre rdf:ID="History"/>
<Genre rdf:ID="Philosophy"/>
<Genre rdf:ID="Memoir"/>

<owl:Class rdf:ID="BookGenre">
<rdfs:subClassOf>
<owl:AllDifferent rdf:about="#GenreList">
<owl:distinctMembers rdf:parseType="Collection">
<Genre rdf:about="#Fiction" />
<Genre rdf:about="#Nonfiction" />
<Genre rdf:about="#History" />
<Genre rdf:about="#Philosophy" />
<Genre rdf:about="#Memoir" />
</owl:distinctMembers>
</owl:AllDifferent>

</rdfs:subClassOf>
</owl:Class>

<owl:SymmetricProperty rdf:ID="bundledWith">
<rdfs:domain rdf:resource="#Product"/>
<rdfs:range rdf:resource="#Product"/>
</owl:SymmetricProperty>

<owl:TransitiveProperty rdf:ID="genreOf">
<rdfs:domain rdf:resource="#Book"/>
<rdfs:range rdf:resource="#BookGenre"/>
</owl:TransitiveProperty>

<owl:Class rdf:ID="FictionBook">
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="#genreOf" />
<owl:hasValue rdf:resource="#Fiction" />
</owl:Restriction>
</owl:equivalentClass>
</owl:Class>

<owl:Class rdf:ID="StockItem">
</owl:Class>
<owl:DatatypeProperty rdf:ID="itemPrice">
<rdfs:domain rdf:resource="#StockItem"/>
<rdfs:range rdf:resource="&xsd;double"/>
</owl:DatatypeProperty>
<owl:DatatypeProperty rdf:ID="itemDescription">
<rdfs:domain rdf:resource="#StockItem"/>

<rdfs:range rdf:resource="&xsd;string"/>
</owl:DatatypeProperty>
<owl:DatatypeProperty rdf:ID="itemDetailURL">
<rdfs:domain rdf:resource="#StockItem"/>
<rdfs:range rdf:resource="&xsd;string"/>
</owl:DatatypeProperty>

<owl:ObjectProperty rdf:ID="stockedProduct">
<rdfs:domain rdf:resource="#StockItem"/>
<rdfs:range rdf:resource="#Product"/>
</owl:ObjectProperty>

<owl:ObjectProperty rdf:ID="stocks">
<rdfs:domain rdf:resource="#Store"/>
<rdfs:range rdf:resource="#StockItem"/>
</owl:ObjectProperty>
</rdf:RDF>

Bạn sẽ không sử dụng tất cả các định nghĩa này trong phần hướng dẫn, nhưng điều
quan trọng cần nhận biết là cấu trúc, một kho Store chứa StockItems có thể ví dụ
là Book, Movie và vân vân. Theo cách này bạn có thể xác định một Book một cách
khái quát, các thiết lập thuộc tính về tác giả, nhà xuất bản,…nhưng vẫn còn sự
khác biệt về giá cả và thông tin giao hàng phụ thuộc vào các kho hàng mà từ đó
khách hàng mua sách.
Nhớ là chúng chỉ là các định nghĩa. Dữ liệu thực tế bao gồm các cá thể hoặc
những ví dụ cho mỗi lớp. Ví dụ (xem ví dụ 3).

Ví dụ 3. Các cá thể của bản thể luận



<Bookstore rdf:ID="Amazon.com">
<endpoint>
</Bookstore>

<Bookstore rdf:ID="BarnesAndNoble.com"/>

<Author rdf:ID="J_K_Rowling"/>

<Author rdf:ID="Joanne_Rowling">
<owl:sameAs rdf:resource="#J_K_Rowling" />
</Author>
<Author rdf:ID="Fyodor_Dostoevsky"/>

<Book rdf:ID="Harry_Potter_and_the_Sorcerers_Stone">
<writtenBy rdf:resource="#J_K_Rowling"/>
</Book>

<StockItem rdf:ID="Harry_Potter_and_the_Sorcerers_Stone_amazon">
<itemPrice rdf:datatype="
>29.99</itemPrice>
<itemDescription>Harry Potter and the Sorcerers
Stone</itemDescription>
<itemDetailURL>zonurlforbook</itemDetailURL>
<stockedProduct
rdf:resource="#Harry_Potter_and_the_Sorcerers_Stone" />
</StockItem>

<Book rdf:ID="Crime_and_Punishment">
<writtenBy rdf:resource="#Fyodor_Dostoevsky"/>
<bundledWith

rdf:resource="#Harry_Potter_and_the_Sorcerers_Stone"/>
</Book>


Bạn có thể đặt những cá thể này trong tệp riêng của chúng hoặc trong cùng một
tệp của các định nghĩa; điều quan trọng là các không gian tên phải phù hợp với
nhau.
Trong bài viết này, bạn sẽ tạo các cá thể từ dữ liệu chiết xuất được từ các dịch vụ
Web cụ thể.


Cài đặt
Bài viết này giả định rằng bạn đã có một hệ thống mashup được cài đặt và đang
làm việc, đồng thời có hoặc không có bộ nhớ cơ sở dữ liệu DB2. Để biết thêm
thông tin về việc thiết lập Tomcat và các thành phần khác, xem Phần 1 và Phần 2
của loạt bài viết (xem Tài nguyên).
Bạn cũng có thể cần đến Jena API để hoàn thành các đoạn mã trong bài viết này.
Có thể tải Jena từ Để cài đặt, đơn giản chỉ cần thêm
các tệp Jena *.jar vào đường dẫn lớp (class path).
bài viết này sử dụng các dịch vụ giao diện của Amazon Web làm ví dụ. Để thực
hiện việc mã hóa, bạn cần có các biểu tượng phát triển (developers token), và thay
thế chuỗi các số 0 (000000000000000) trong mã bằng công cụ đó. Để có biểu
tượng phát triển, xem
ạo cho người sử dụng sự lựa chọn: giao diện
Mục đích của bài viết này là cung cấp một phương thức cho người dùng thay thế
một dịch vụ bằng một dịch vụ khác dựa trên thông tin trong bản thể luận. Hãy bắt
đầu bằng việc cho người dùng một lựa chọn.
Tạo ra các cá thể
Bước đầu tiên là tạo một cá thể từ đó khách hàng sẽ lựa chọn. Bạn sẽ phải tạo ra
các trường hợp cá biệt của các lớp Bookstore. Ví dụ, tệp bản thể luận hiện nay

nhìn giống như ví dụ 4.

Ví dụ 4. Tạo ra các cá thể

<Bookstore rdf:ID="BarnesAndNoble.com"/>
<Bookstore rdf:ID="Amazon.com"/>
<Bookstore rdf:ID="Buy.com"/>

<Author rdf:ID="J_K_Rowling"/>
<Author rdf:ID="Joanne_Rowling">
<owl:sameAs rdf:resource="#J_K_Rowling" />

</Author>
<Author rdf:ID="Fyodor_Dostoevsky"/>

<Book
rdf:ID="Harry_Potter_and_the_Sorcerers_Stone">

<writtenBy
rdf:resource="#J_K_Rowling"/>
</Book>


Nhưng tất nhiên chúng hiện chỉ đơn thuần là Bookstores. Sau đó, bạn phải thêm
thuộc tính cho chúng
Ghi nhớ là bạn có vài cá thể ở đây và có nhiều loại khác nhau. Bạn phải sử dụng
API để kiểm tra các đối tượng này.


Tạo ra mô hình

Để trông gọn gàng hơn một chút, bạn sẽ phải điều chỉnh tất cả các chức năng bản
thể luận ở trong một lớp mới, MashupOntologyReader. Bắt đầu bằng việc tạo ra
lớp cơ bản (xem ví dụ 5):

Ví dụ 5. Lớp cơ bản

import com.hp.hpl.jena.ontology.*;
import java.util.Iterator;
import com.hp.hpl.jena.rdf.model.ModelFactory;

public class MashupOntologyReader {

private OntModel bookStoreOntModel;

public MashupOntologyReader(){

// create an ontology model
bookStoreOntModel =
ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, null);

}

public static void main(String[] args) {

MashupOntologyReader reader = new MashupOntologyReader();
}

}

Ở đây bạn sử dụng ModelFactory để tạo một mô hình bản thể luận. Lưu ý là Jena

API đồng thời cũng là một RDF API, cho nên nó cho phép bạn tạo ra rất nhiều
kiểu mô hình khác nhau. Bình thường, trong trường hợp này, bạn cần một mô hình
bản thể luận, và thông qua các dữ liệu cố định được cung cấp, bạn phải xác định rõ
là bạn muốn nó nằm bên trong bộ nhớ.


Tải bản thể luận
Jena API cho phép bạn tạo các bản thể luận từ đầu và bao gồm các phương thức
cần thiết để thực hiện, trong trường hợp này, bạn đã có sẵn một tệp bản thể luận để
đọc, cho nên bước tiếp theo là tải nó từ mô hình bạn vừa tạo ra (xem ví dụ 6):

Ví dụ 6. Tải bản thể luận


public class MashupOntologyReader {

private OntModel bookStoreOntModel;

public MashupOntologyReader(){
String source = "

// create an ontology model
bookStoreOntModel =
ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, null);

// you have a local copy of the bookstore ontology
bookStoreOntModel.getDocumentManager().addAltEntry( source,
"file:c:/sw/stores.owl" ); //
read the source document bookStoreOntModel.read( source );


}

public static void main(String[] args) {

MashupOntologyReader reader = new MashupOntologyReader();
}

}

Đầu tiên, hãy dành chỗ ghi tên cho đối tượng bạn vừa tải. Với bản thể luận bạn đã
xây dựng ở phần 4, không gian tên là Từ đó bạn sử
dụng của mô hình DocumentManager để thêm vào các đầu mục. Lưu ý rằng bạn
chỉ rõ không gian tên và tập tin mà từ đó cho phép thâm nhập, nhưng các mô hình
không thực sự đọc các định nghĩa trừ khi bạn gọi hàm read().


Duyệt qua các cá thể
Mục tiêu là có được danh sách các cá thể Bookstore trong bản thể luận, vì thế bắt
đầu bằng việc đi qua chuỗi tất cả các cá thể có mặt (xem ví dụ 7).

Ví dụ 7. Duyệt các cá thể


// read the source document
bookStoreOntModel.read( source );

}

public void getIndividuals(){


int counter = 0;

for (Iterator i = bookStoreOntModel.listIndividuals(); i.hasNext(); ) {

counter++;
Individual thisIndividual = (Individual) i.next();
System.out.println(counter);

}

}

public static void main(String[] args) {

MashupOntologyReader reader = new MashupOntologyReader();
reader.getIndividuals();

}

}

Để bắt đầu, cần tạo ra một phương thức getIndividuals() mà nó sẽ tạo ra một bộ
đếm và sử dụng mô hình của phương thức listIndividuals() của bản thể luận để lấy
bộ lặp Iterator chuẩn của JAVA qua nó bạn có thể tiếp cận các cá thể tìm được.
Bạn chưa có bất kỳ một dữ liệu nào về các cá thể do đó đơn giản cung cấp một bộ
đếm để xem điều gì xảy ra. Bạn sẽ có một danh sách từ một đến mười một.
Bây giờ mọi việc đều thú vị, rõ ràng bạn có nhiều hơn là các cá thể Bookstore.
Hãy tìm hiểu xem bạn thật sự thu được cái gì.



Có các thông tin về cá thể
Khi có thông tin tham khảo của cá thể, việc thu thập các thông tin của nó là vấn đề
đơn giản thông qua sử dụng các phương thức thu thập mà API cung cấp. Bất kỳ
một cá thể Individual nào, cho dù là loại đối tượng nào, đều có ba loại thông tin
giống nhau: URI, sử dụng duy nhất để xác định tài nguyên, kiểu, và tên, cái mà
tương ứng với thuộc tính rdf:ID trong tệp RDF (xem ví dụ 8):

Ví dụ 8. Lấy thông tin cá thể


public void getIndividuals(){

int counter = 0;

for (Iterator i = bookStoreOntModel.listIndividuals(); i.hasNext(); ) {

×