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

TÌM HIỂU VỀ RDF VÀ ỨNG DỤNG VÀO LẬP TRÌNH SEMATIC WEB

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 (1.62 MB, 32 trang )

ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN






TIỂU LUẬN
BIỂU DIỄN TRI THỨC VÀ ỨNG DỤNG

Đề tài: TÌM HIỂU VỀ RDF VÀ ỨNG DỤNG
VÀO LẬP TRÌNH SEMATIC WEB


GVHD: PGS.TS. Đỗ Văn Nhơn
Học viên thực hiện:
Phan Đình Duy CH1101060
Lớp: CH CNTT K6
Khóa: 2011


TP.Hồ Chí Minh, tháng 01 năm 2013



LỜI CẢM ƠN

Em xin gửi lời cảm ơn chân thành đến thầy PGS.TS Đỗ Văn Nhơn, người đã
dành nhiều thời gian quý báu của mình để truyền đạt cho lớp CH CNTT K6 những
kiến thức bổ ích, lý thú về biểu diễn tri thức và ứng dụng. Đây là những kiến thức


hết sức cần thiết cho hành trang của chúng em trong công việc nghiên cứu về lĩnh
vực tin học. Đặt biệt thầy đã truyền đạt các kiến thức và ví dụ minh họa rất bổ ích
cho chúng em về ontology. Đây chính là tiền đề, là kiến thức nền tảng đã thôi thúc
em thực hiện đề tài tiểu luận về “Tìm hiểu về RDF và ứng dụng vào lập trình
Semantic Web”.
Xin chân thành cảm ơn sự giúp đỡ của các bạn bè, anh chị, những người đã
thảo luận và đóng góp ý kiến, giúp đỡ em tìm kiếm thông tin và động viên tinh thần
cho em trong suốt quá trình thực hiện tiểu luận.
Một lần nữa xin chân thành cảm ơn đến tất cả những người đã quan tâm đến
tiểu luận của em. Tuy nhiên, trong quá trình làm việc không thể tránh khỏi những
sai sót, rất mong sự đóng góp ý kiến nhiệt tình của Thầy và các bạn.

Học viên thực hiện
Phan Đình Duy
Lớp: CH CNTT K6
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


1
Phan Đình Duy

Mục lục

Chương 1. BIỂU DIỄN DỮ LIỆU BẰNG RDF 3
1.1 Định nghĩa RDF. 3
1.2 Mô hình dữ liệu RDF 3
1.2.1 URIs 4
1.2.2 Blank Nodes 4
1.2.3 Literal values - Giá trị nghĩa đen 5
1.3 Các định dạng lưu trữ RDF 6

1.3.1 N-Triples 7
1.3.2 N3 7
1.3.3 RDF/XML 8
1.4 Ontology 8
Chương 2. ỨNG DỤNG RDF VÀO LẬP TRÌNH SEMANTIC WEB 11
2.1 Sử dụng Sesame như công cụ lưu trữ và truy vấn 12
2.1.1 Cài đặt ứng dụng web Sesame 12
2.1.2 Tạo mới kho dữ liệu 12
2.1.3 Load dữ liệu thô tạo đồ thị ngữ nghĩa 14
2.1.4 Đẩy dữ liệu từ đồ thị lên sesame(qua định dạng RDF/XML) 16
2.2 Tạo ứng dụng web 18
2.3 Màn hình chung 18
2.4 Mở rộng các tập dữ liệu từ các nguồn công cộng 20
2.5 Tạo màn hình theo chức năng 24
2.6 Trực quan hóa giao diện 25
Chương 3. KẾT LUẬN 29

BIỂU DIỄN TRI THỨC & ỨNG DỤNG


2
Phan Đình Duy

DANH MỤC HÌNH ẢNH
Hình 1-1 Blank nodes trong mạng xã hội thể hiện thành viên 4
Hình 1-2 Blank node mô hình hóa một địa chỉ liên lạc 5
Hình 1-3 Đồ thị các mối quan hệ của TobySegaran 6
Hình 2-1 Màn hình cấu hình của Sesame 12
Hình 2-2 Tạo mới kho dữ liệu 13
Hình 2-3 Kho dữ liệu được tạo với id là joblistings 14

Hình 2-4 Kết quả tìm danh sách các công ty tuyển dụng 17
Hình 2-5 Xem danh sách Triple bằng export 17
Hình 2-6 Kết quả của màn hình liên kết Subject - Predicate - Object 20
Hình 2-7 Kết quả truy xuất tìm thông tin về công ty trên Crunchbase dựa vào keys 21
Hình 2-8 Nội dung của đồ thị trên kho seasame 23
Hình 2-9 Thông tin bổ sung đã được cập nhật 23
Hình 2-10 Màn hình cụ thể về các vị trí tuyển dụng và thông tin về công ty 25
Hình 2-11 Kết quả JSON trả về bởi hàm exhibit_job_data 26
Hình 2-12 Màn hình thể hiện biểu đồ jobs theo salary và funding dạng plot 28

BIỂU DIỄN TRI THỨC & ỨNG DỤNG


3
Phan Đình Duy

Chương 1. BIỂU DIỄN DỮ LIỆU BẰNG RDF
1.1 Định nghĩa RDF.
Chúng ta thấy rằng việc chuyển sang mô hình dữ liệu đồ thị là khá dễ dàng, và là một
ý tưởng tốt. Nhưng với dữ liệu đã được nạp vào đồ thị, làm thế nào để chia sẽ dữ liệu đó
cho người khác? Đó chính là lý do của sự xuất hiện Resource Description
Framework(RDF) của W3C. RDF cung cấp một cách biểu diễn chuẩn của đồ thị, cho
phép chia sẽ chúng với người khác, và quan trọng hơn là với máy tính. Bởi vì nó là một
chuẩn mà W3C “khuyến khích", một tập lớn các công cụ và dịch vụ đã xuất hiện quanh
khái niệm về RDF.RDF là một “bộ khung” được sử dụng để mô tả các nguồn tài nguyên
trên Internet. RDF cung cấp một mô hình dữ liệu, và một cú pháp đơn giản sao cho các hệ
thống độc lập có thể trao đổi và sử dụng nó.
RDF được thiết kế sao cho hệ thống máy tính có thể hiểu được và có thể đọc được
thông tin, chứ không phải để trình bày dữ liệu cho người dùng.Là một thành phần của
Semantic Web, được đặt trên XML, RDF sử dụng cú pháp của XML để biểu diễn thông

tin, điều này có nghĩa là các tài liệu RDF được viết bằng XML. Ngôn ngữ XML dùng để
biểu diễn thông tin trong RDF được gọi là RDF/XML. Thông qua định dạng này, các
thông tin trong RDF có thể được trao đổi dễ dàng giữa các hệ thống máy tính cũng như
các hệ điều hành hay các ngôn ngữ lập trình ứng dụng khác nhau.
RDF mô tả siêu dữ liệu về các tài nguyên trên Web. RDF dựa trên cú pháp XML tuy
nhiên XML chỉ mô tả dữ liệu, RDF còn có khả năng biểu diễn ngữ nghĩa giữa chúng
thông qua các tài nguyên được định danh bằng URI.
1.2 Mô hình dữ liệu RDF
Hiểu một cách cực kỳ đơn giản dựa vào những khái niệm về mô hình ngữ nghĩa mà
chúng ta đã tìm hiểu trong phần trước, RDF chẳng qua là một cách chuẩn hóa mô hình
ngữ nghĩa bằng triple, là một cấu trúc gồm 3 thành phần chính (Subject-Predicate-
Object). Điểm khác biệt duy nhất chính là liên quan đến tài nguyên sử dụng thể hiện
trong triple và các định dạng lưu trữ của chúng.
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


4
Phan Đình Duy

1.2.1 URIs
Universal Resource Identifier (URI): tức là định danh tài nguyên duy nhất. Trong đó
URL là tập con của URI chỉ vị trí tài nguyên duy nhất mà chúng ta đã quá quen thuộc khi
sử dụng web.
Mô hình DRF sử dụng URI như tài nguyên cho tất cả các thành phần trong mô hình
từ subject, predicate đến object nhằm đảm bảo tính duy nhất và đồng thời cũng là giá trị
để truy xuất đến các thông tin có nghĩa thực sự.
Điều quan trọng là cần lưu ý rằng URI không phải là URL (mặc dù mỗi URL là một
URI). Một cách thực tế, điều này có nghĩa là bạn không nên cho rằng URI sẽ tạo ra bất kỳ
thông tin nào nếu bạn gõ vào một trình duyệt web. Mà nó có nghĩa rằng, cố gắng làm
càng nhiều thông tin tài nguyên sẵn có tại địa chỉ là một cách tốt.

Một cách sử dụng phổ biến và ngắn gọn của URI trong RDF là chỉ ra khái niệm
namespace (không gian sử dụng chung) để định nghĩa phần cơ sở của URI (base) và chỉ
thể hiện bằng tên namespace cộng với thành phần phân biệt còn lại của URI.
1.2.2 Blank Nodes
Trong trường hợp bạn không biết URI bạn cần biểu diễn, hoặc chúng không tồn tại.
Điều đó không có nghĩa là chúng không tồn tại, trong trường hợp này RDF đưa ra khái
niệm gọi là “anonymous” hoặc“blank nodes”. Blank Node là một node bất kì, nhưng
chúng không có URI.

Hình 1-1 Blank nodes trong mạng xã hội thể hiện thành viên
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


5
Phan Đình Duy

Trong biểu diễn triple, Blank node được thể hiện bằng quy tắc đặt tên _:id, trong đó
id là tùy ý nhưng phải suy nhất trong phạm vi đồ thi.
Ví dụ , biểu thức định dạng triple cho mô hình ở Hình 1-1như sau
(_:ax1, "weblog", "")
(_:ax1, "surName", "Segaran")
(_:ax1, "givenName", "Toby")
(_:ax1, "knows", _:zb7)
(_:zb7, "surName", "Taylor")
(_:zb7, "givenName", "Jamie")
(_:zb7, "email", "")
Ngoài ra Blank Node là một node có ý nghĩa bao gồm sự kết hợp của nhiều thành
phần khác mà khái niệm URI của node đó không tồn tại hoặc phải là sự kết hợp của nhiều
nodes kia. Ví dụ trong Hình 1-2 là điển hình cho nhóm các thành phần cấu thành blank
node.


Hình 1-2 Blank node mô hình hóa một địa chỉ liên lạc
1.2.3 Literal values - Giá trị nghĩa đen
DRF sử dụng literal values tương tự mà ví dụ về graph đã làm, nó thể hiện những
kiểu cơ bản nhất về subject và object. Một literal values có thể có giá trị tùy chọn về ngôn
ngữ hoặc kiểu dữ liệu ví dụ, thay cho giá trị số
nguyên. Mã ISO 639 được sử dụng để chỉ định ngôn ngữ; Ví dụ, en cho tiếng Anh hoặc
ja cho Nhật Bản
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


6
Phan Đình Duy

1.3 Các định dạng lưu trữ RDF
Cách sử dụng RDF thì dường như khá đơn giản nhưng cấu trúc lưu trữ chúng thì khá
phức tạp, tuy nhiên chúng ta không lo lắng về điều này vì RDF đã có sẵn những chuẩn
định dạng lưu trữ khá tốt.
Chúng ta sẽ tìm hiểu bốn định dạng tuần tự hóa ở đây: N-Triples, mô tả đơn giản
nhất; N3, phiên bản ngắn gọn của N-Triple; RDF / XML, một trong những định dạng sử
dụng thường xuyên nhất và cuối cùng, "RDF in attributes" (RDFa), được nhúng vào các
format khác như XHTML.
Để có thể dễ dàng tìm hiểu chúng ta hãy xem qua Hình 1-3 một đồ thị về bạn bè và
các mối quan hệ.

Hình 1-3 Đồ thị các mối quan hệ của TobySegaran
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


7

Phan Đình Duy

1.3.1 N-Triples
Định dạng đơn giản và gần với cấu trúc gốc của Triple nhất, có định dạng
Subject1 Predicate1 Object1.
Subject2 Predicate2 Object2.

Trong đó mỗi triple là một dòng đơn gồm 3 thành phần và kết thúc bằng dấu chấm.
Các thành phần được thể hiện bằng URI được bao quanh bởi dấu <> bao quoanh, ngoại
trừ
 Blank Node thể hiện bằng _:id ( id là chuỗi tự do tuân theo nguyên tắc đặt tên)
 Literal values : thể hiện bằng chuỗi trong ngoặc kép.
Chỉ định @lang theo sau để chỉ ngôn ngữ : ISO 639
Chỉ định ^^type theo sau để chỉ kiểu dữ liệu : XSD
 N-Triples được lưu xuống file dưới đuôi là .nt
1.3.2 N3
N3 là phiên bản nâng cấp khắc phục tình trạng bị lặp lại của N-Triples, bằng cách đưa
ra một số cách định nghĩa trước và quy tắc thể hiện theo nhóm. Một số bổ sung sau
 Định nghĩa @prefixsemperp: <
 Sử dụng semperp:colin thay cho <
 Nhóm các predicate và object vào chung một nhóm để tranh lặp lại subject.
 Subject1 P1_1O1_1;P1_2 O1_2.
 Với Subject là Blank Node nhóm các predicate và object vào chung và đặt bên
trong ngoặc vuông [].
 Subject1 Predicate S2,[P2_1 O2_1;P2_2 O2_2].
 Kí tự a, được thể hiện cho predicate thuộc kiểu dữ liệu (URI =
< )
 < hoặc owl:sameAs được thể hiện bởi
dấu = .
BIỂU DIỄN TRI THỨC & ỨNG DỤNG



8
Phan Đình Duy

1.3.3 RDF/XML
RDF/XML là mô hình dữ liệu của RDF được biểu diễn bằng XML.
Ở phần đầu tiên là nơi định nghĩa namespace ví dụ
<rdf:RDF xmlns:rdf="
Phần nội dung, định dạng này được thể hiện theo mô hình tree, bám theo các giá trị
subject gốc ban đầu. Trong cấu trúc phân cấp các giá trị con chính là các thành phần kế
tiếp trong dãy liên kết O-P-O-P-O….
Sử dụng tên của kiểu dữ liệu để làm node biểu diễn dữ liệu cho đối tượng thuộc kiều
đó ví dụ
<foaf:Person rdf:about="
 Foaf:Person là kiểu dữ liệu cho đối tượng thể hiên cho tody.
 Rdf:about là uri của đối tượng doty.
 Literal values được thể hiện bằng nội dung text của xml node hoặc như một thuột
tính trong rdf:Description
 Giá trị đối tượng trong node rdf:Description có kiểu là X thì nó được thể hiện bằng
cách thay thế tên rdf:Description thành tên X.
1.4 Ontology
Mô hình dữ liệu RDF đã cho chúng ta một khá tổng quát về tổ chức ngữ nghĩa. Tuy
nhiên, cũng vì tính quá chung chung đó mà tất cả các thực thể, đối tượng, quan hệ của
chúng trở nên cực kì lộn xộn, không rõ ràng phạm vi sử dụng trong một lĩnh vực xác
định.Ontology đã được áp dụng vào mô hình RDF để làm nó trở nên rõ ràng hơn về ý
nghĩa và tính trong sáng cua mô hình.
Sau khi khi trãi qua một loạt các mô hình ngữ nghĩa, chúng ta thấy rằng mô hình sử
dụng Subject-predicate-object là một phương pháp hữu ích và linh hoạt cho việc biểu
diễn tri thức.Các nhà triết học từ thời Aristotle đã quan tâm rất nhiều về việc biết những

gì tồn tại và làm thế nào để mô tả nó.Và một khi bạn nghĩ rằng bạn biết rằng một cái gì đó
tồn tại, bước tiếp theo là tìm phạm vi cho nó trong số tất cả những thứ khác.Trong lĩnh
vực triết học, nỗ lực này được gọi là ONTOLOGY.
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


9
Phan Đình Duy

Vì sao chúng ta lại quan tâm đến vấn đề của triết học ? bởi vì triết học đưa ra những
khái niệm chung nhất về thế giới và vũ trụ, chúng ta làm phần mềm liên quan tới ngữ
nghĩa cần mô hình của thế giới. Do đó chúng ta cũng cần tới những khái niệm liên quan
đến thế giới.
Xây dựng mô hình của thế giới là không có gì mới đối với các nhà thiết kế hệ thống.
Chúng ta đã và đang làm điều này mọi lúc mọi nơi, tạo các mô hình cơ sỡ dữ liệu và quan
hệ. Tuy nhiên, với các hệ thống ngữ nghĩa, chúng ta cần phải thể hiện các mô hình này
theo cách mà hệ thống phân phối trên Web có thể đọc và hiểu chính xác các mô hình của
chúng ta và sử dụng chúng.
Ontology cung cấp một tập từ vựng chính xác với những tri thức mà nó mang theo.
Từ vựng này cho phép chúng ta xác định các thực thể sẽ được biểu diễn, làm thế nào
chúng có thể được nhóm lại và các mối quan hệ của chúng.
Vì vậy, làm thế nào để chúng ta biết được Ontology của chúng ta là thứ chính xác?
Nó chỉ đúng khi mà mọi người và các hệ thống sử dụng nó có thể để tương tác thành
công. Đây là cùng một tiêu chuẩn mà chúng ta áp dụng phần mềm máy tính. Chương
trình chạy không? Chúng ta nhận được câu trả lời chạy? Nếu vậy, chúng ta thành công.
Tương tự như mô hình hướng đối tượng (object-oriented - OO), mô hình ngữ nghĩa
(sematic) cũng sử dụng khái niệm class để mô tả nhóm các thực thể cùng tính chất và
quan hệ. Trong hầu hết các mô hình hướng đối tượng một đối tượng là một thể hiện của
một lớp bởi vì chúng nó được tạo bởi định nghĩa của lớp đó. Một khi một thể hiện được
tạo ra nó sẽ chứa tất cả các thuộc tính và hành động của lớp tạo ra nó.

Dữ liệu ngữ nghĩa, như chúng ta đã thấy nó tập trung vào mối quan hệ giữa các thực
thể. Vì vậy mô hình ngữ nghĩa lại là mô hình hướng thuộc tính chứ không phải hướng đối
tượng.
Các thực thể ngữ nghĩa không được sinh ra từ trong một lớp, mà chúng được hiểu là
một thành phần của lớp dựa vào những thuộc tính của chúng cùng chung một nhóm.
Chúng ta thấy phân biệt kiểu này thì quá chi tiết, nhưng việc tập trung vào các mối quan
hệ sẽ cho mô hình trở nên tuyệt vời và mềm dẽo hơn.
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


10
Phan Đình Duy

Trong hệ thống hướng đối tượng, một thuộc tính là 1 phần của lớp, một khi bạn biết
đối tượng là nằm trong lớp nào bạn sẽ biết danh sách các thuộc tính của đối tượng đó.
Trong hệ thống ngữ nghĩa, thuột tính được định nghĩa độc lập, một thuộc tính có thể khai
báo nó thuộc kiểu tài nguyên nào ( resouce – tương tự class trong OO). Tập hợp các kiểu
( tài nguyên) sử dụng thuộc tính đó được gọi là domain ( lĩnh vực,phạm vi) của thuộc
tính. Có nghĩa là một thuộc tính nằm có thể nằm trong nhiều kiểu khác nhau. Tương tự
như vậy, tập hợp các giá trị của nó có thể nhận được thì gọi là range (miền xác định) của
thuộc tính.


BIỂU DIỄN TRI THỨC & ỨNG DỤNG


11
Phan Đình Duy

Chương 2. ỨNG DỤNG RDF VÀO LẬP TRÌNH SEMANTIC WEB

Phần này chúng ta sẽ kết hợp mọi thứ lại với nhau và sử dụng một số công cụ thể tạo
thử một ứng dụng đơn giản tìm hiểu thông tin về các vị trí tuyển dụng trên web.
Yêu cầu của ứng dụng
 Cài đặt và chạy các chức năng cơ bản một cách nhanh chóng.
 Cần mềm dẽo cho việc mở rộng các chức năng.
 Được thiết kế hỗ trợ cho việc truy xuất và chia sẽ thông tin theo dạng chuẩn(ngữ
nghĩa).
 Tương tác nhanh.
Hệ thống sẽ bao gồm 2 phần chính ( mà có thể sẽ mở rộng trong tương lai)
 Lưu trữ và truy vấn mô hình ngữ nghĩa RDF.
 Tạo ứng dụng web truy xuất và thể hiện ra giao diện
Để bắt đầu thực hiện, giả sử chúng ta có sẵn một số dữ liệu dạng bảng có sẵn trên
web đã được rút trích ra là danh sách các nghề nghiệp (jobs). Bạn có thể download tại đây

Nội dung như sau:
"JobTitle","Salary","Location","Company","Crunchbase","Ticker"
"Tugboat Captain",10000,"San
Francisco,CA","Metaweb","metawebtechnologies”
"Ancient Mariner",20000,"New York, NY","Google","google","GOOG"
"Fisherman",30000,"Seattle, WA","Microsoft",,"MSFT"
"Third Mate",40000,"Sunnyvale, CA","Yahoo",,"YHOO"
"Stevedore",50000,"New York, NY","Tumblr","tumblr"
Đây chỉ là cách tạo một ứng dụng ban đầu nên giả sử rằng có sẵn tập dữ liệu này,
trong thực tế tập dữ liệu này sẽ được rút trích trực tiếp trên các hệ thống website về
jobs.Việc cần làm đầu tiên là sẽ lấy danh sách dữ liệu này chuyển sang dạng lưu trữ RDF
trước khi tiếp tục công việc.

BIỂU DIỄN TRI THỨC & ỨNG DỤNG



12
Phan Đình Duy

2.1 Sử dụng Sesame như công cụ lưu trữ và truy vấn
2.1.1 Cài đặt ứng dụng web Sesame
Download openrdf-sesame-2.6.2-sdk.zip từ địa chỉ

Giải nén tìm và chép 2 files webapp openrdf-sesame.war và openrdf-workbench.war
vào thư mục webapps của web server (giả sử ta đã có web server)
Cấu hình lại port cho web server tới 8180.
Sau khi hoàn tất ta có thể truy xuất vào địa chỉ http://localhost:8180/openrdf-
workbench để xem màn hình thiết lập của sesame như Hình 2-1 sau

Hình 2-1 Màn hình cấu hình của Sesame
2.1.2 Tạo mới kho dữ liệu
Để tạo mới một nơi chứa dữ liệu mô hình, chọn “New Repository”
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


13
Phan Đình Duy


Hình 2-2 Tạo mới kho dữ liệu
Thông tin cần quan tâm ở đây là ID = joblistings , nó sẽ là id để sử dụng phân biệt
với các kho dữ liệu khác.
Như vậy là chúng ta đã có một kho chứa dữ liệu trên sesame với dữ liệu là rỗng Hình
2-3. Chúng ta có thể thêm dữ liệu vào kho bằng các dữ liệu được định dạng chuẩn theo
RDF trên file hoặc url trên mạng.
Tuy nhiên những gì ta có chỉ là một danh sách các jobs trong file csv. Do đó điều đầu

tiên cần làm là cần phải thêm dữ liệu vào kho bằng cách code ( cũng để tìm hiểu rõ hơn
bằng cách thêm dữ liệu động)
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


14
Phan Đình Duy


Hình 2-3 Kho dữ liệu được tạo với id là joblistings
2.1.3 Load dữ liệu thô tạo đồ thị ngữ nghĩa
Tạo một module nhỏ của Python để thực hiện công việc này, module này ta đặt tên là
convert_jobs.py (trong source code đi kèm)
fromrdflibimportConjunctiveGraph
fromrdflibimportNamespace,BNode,Literal,RDF,URIRef
importcsv
JOBS=Namespace(" />smodule#")
DC=Namespace("
JB=Namespace("
COMPANY=Namespace("
RDFS=Namespace('
jg=ConjunctiveGraph()
jg.bind('jobs',JOBS)
jg.bind('dc',DC)
jg.bind('jobboard',JB)
jg.bind('company',COMPANY)
jg.bind('rdfs',RDFS)
# Incremental counter for vacancy IDs
vid=0
BIỂU DIỄN TRI THỨC & ỨNG DỤNG



15
Phan Đình Duy

fortitle,salary,location,company,crunchbase,tickerincsv.reader(file('joblist.csv')): #
load file
# Create the vacancy
vid+=1 # tự động thêm cho duy nhất trong nội bộ để đưa lên URI JB thể hiện đối tượng
duy nhất – và bổ sung các thông tin liên quan đến đối tượng này
vacancy=JB[str(vid)]#tạo node kiểu URIRef
jg.add((vacancy,RDF.type,JOBS['Vacancy']))
jg.add((vacancy,DC['title'],Literal(title)))
location_id=location.lower().replace(' ','_').replace(',','')
jg.add((vacancy,JB['location'],JB[location_id])) # thêm vị trí cho vacancy
jg.add((JB[location_id],DC['title'],Literal(location)))
# Salary range
salaryrange=BNode() # Blank Node
jg.add((vacancy,JOBS['salaryrange'],salaryrange))#thêm mức lương vacancy
jg.add((salaryrange,JOBS['minimumsalary'],Literal(float(salary))))
# Create the company
cnode=JB[company.lower().replace(' ','_')]#tạo node kiểu URIRef
jg.add((vacancy,JOBS['vacancywith'],cnode)) #thêm công ty tuyển dụng
jg.add((cnode,RDF.type,JOBS['Organization']))#thêm kiểu cho cty
# Ticker symbol
ifticker!="":
jg.add((cnode,COMPANY['symbol'],Literal(ticker)))
jg.add((cnode,COMPANY['name'],Literal(company)))
# Crunchbase (see also)
ifcrunchbase!="":

jg.add((cnode,RDFS['seeAlso'],
Literal('
Trước tiên hãy để ý đến các namespace. Các namespace này không là gì cả, chúng ta
có thể thay đổi nó, nhưng mức độ mở rộng dựa vào những URI chuẩn này sẽ bị giảm đi,
bởi vì nó hàm chứa những tri thức cần bổ sung sau này đã có sẳn.
Tạo mới đồ thị bằng rdflib và thêm các namespace vào chúng cho việc sử dụng sau
đó.
Bước sau là duyệt qua danh sách các giá trị trong bảng dữ liệu và thêm vào cấu trúc
như chú thích trong phần code. Chú ý rằng mỗi namespace là một dạng node kiểu
URIRef. Do đó trong code việc lấy ra 1 biến theo tên là tạo ra một URIRef Node.
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


16
Phan Đình Duy

Thực thi để đưa dữ liệu lên kho trên sesame.
Sau khi tạo graph, load dữ liệu từ csv ( bằng cách chạy module convert_jobs.py),
chúng ta sẽ có một graph tên jg trong bộ nhớ.
Chúng ta hãy lưu chúng thành định dạng RDF/XML như sau
data=jg.serialize(format='xml')
2.1.4 Đẩy dữ liệu từ đồ thị lên sesame(qua định dạng RDF/XML)
Sesame cho phép giao tiếp sử dụng phương thức web http GET,PUT,POST thông qua
REST API để thao tác trên kho dữ liệu của sesame.
Tạo một lớp tên là connection sử dụng để truy xuất và thêm dữ liệu với sesame.
Lớp này cho phép:
 Kết nối tới sesame server
 Thiết lập kho dữ liệu cần sử dụng
 Định nghĩa các namespace
 Query dữ liệu : kết quả ra dạng JSON

 Queru dữ liệu : kết quả dạng RDF/XML
 Thêm bổ sung dữ liệu lên server (định dạng rdf/xml)

Như vậy là quá trình kết nối và chuyển dữ liệu lên sesame hoàn tất. Chúng ta có thể
truy xuất vào giao diện sesame để sử dụng ngôn ngữ SPARSL để truy vấn trực tiếp trên
đó, ví dụ để tìm danh sách các công ty, nhập câu query sau ( lưu ý các namespace đã
được định nghĩa sẵn)
SELECT ?company
WHERE{
?doncare company:name ?company.
}
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


17
Phan Đình Duy

Kết quả xuất hiện như Hình 2-4

Hình 2-4 Kết quả tìm danh sách các công ty tuyển dụng
Hoặc sử dụng export để xem tất cả các triples và di chuyển theo các đường link để
hiểu cấu trúc được lưu.

Hình 2-5 Xem danh sách Triple bằng export
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


18
Phan Đình Duy


2.2 Tạo ứng dụng web
Download web server cherry từ
Sau khi download , upzip và cài vào python như một library tương tự các lệnh cài
trước bằng lệnh: python setup.py install.
CherryPy cho phép tương tác dữ liệu và kết xuất ra giao diện màn hình web. Tuy
nhiên, chúng ta không thể sử dụng code để phát sinh ra các trang HTML trình bày giao
diện web, như vậy khá tốn công.Mako template cho phép liên kết giữa python code và
HTML để việc thể hiện giao diện đơn giản nhất. Về nguyên tắc chung thì nó hoàn toàn
như các ngôn ngữ lập trình web khác truyền thống là ASP,JSP về cách chèn code vào
trong HTML.
Một số nguyên tắc nhỏ khi chèn code python vào HTML
 dấu <% và %> sử dụng để mở và đóng phạm vi sử dụng code.
 sử dụng dấu % cho 1 dòng code python , kết hợp với endif,endfor để kết thúc
phạm vi (ngoại lệ trong python).
 sử dụng ${biến/hàm python} để xuất giá trị ra HTML
2.3 Màn hình chung
Chúng ta sẽ tạo ra màn hình hiện thị thông tin ngữ nghĩa lấy trực tiếp từ kho dữ liệu
theo id công ty tuyển dụng. Thông tin bao gồm tập hợp tất cả các subjects và objects của
id đã cho (trong triple). Có nghĩa tất cả những gì liên quan đến id đó.
con=connection('http://localhost:8180/openrdf-sesame/')
con.addnamespace('rdf',RDF)
con.addnamespace('foaf',FOAF)
con.addnamespace('jb',JB)
con.addnamespace('jobs',JOBS)
con.addnamespace('company',COMPANY)
con.addnamespace('dc',DC)
con.use_repository('joblistings')
namefields=set([str(DC['title']),str(COMPANY['name'])])
classMain(object):
@cherrypy.expose

defindex(self):
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


19
Phan Đình Duy

id=quote_plus('
return'Try visiting <a href="viewgeneral?id=%s">here</a>'%id
@cherrypy.expose
defviewgeneral(self,id):
sa=con.query('select ?pred ?obj where {<%s> ?pred ?obj .}'%id)
oa=con.query('select ?pred ?sub where {?sub ?pred <%s> .}'%id)
name=id
forrowinsa:
ifrow['pred']['value']innamefields:
name=row['obj']['value']
t=lookup.get_template('viewgeneric.html')
returnt.render(name=name,sa=sa,oa=oa,qp=quote_plus)
Đoạn code trên lấy ra danh sách của các subjects và objects, sau đó tìm tên ứng với id
và truyền cả 3 tham số này xuống template để hiển thị. Template Viewgeneric.html có nội
như sau:
<html>
<head>
<title>Viewing ${name}</title>
</head>
<body>
<h1>${name}</h1>
<h3>Subject assertions</h3>
<table>

% for row in sa:
<tr>
<tdstyle="font-weight:bold">${row['pred']['value']}</td>
% if row['obj']['type']=='uri':
<td><ahref="view?id=${qp(row['obj']['value'])}">${row['obj']['value']}</a></td>
% else:
<td>${row['obj']['value']}</td>
% endif
</tr>
% endfor
</table>
<h3>Object assertions</h3>
<table>
% for row in oa:
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


20
Phan Đình Duy

<tr>
<tdstyle="font-weight:bold">${row['pred']['value']}</td>
% if row['sub']['type']=='uri':
<td><ahref="view?id=${qp(row['sub']['value'])}">${row['sub']['value']}</a></td>
% else:
<td>${row['sub']['value']}</td>
% endif
</tr>
% endfor
</table>

</body>
</html>
kết quả hiện thị sau khi chạy Hình 2-6

Hình 2-6 Kết quả của màn hình liên kết Subject - Predicate - Object
Nếu như hệ thống có càng nhiều triple liên kết với nhau qua URI, thì hệ màn hình
này cho phép và có thể lưới tới mọi ngóc ngách như bạn đang di chuyển trên các node
của một đồ thị.
2.4 Mở rộng các tập dữ liệu từ các nguồn công cộng
Sau đây là một ví dụ sử dụng các URI như một nguồn cung cấp dữ liệu tự động khi
liên kết đến các uri chuyên biệt. Một trong những cơ sở dữ liệu tốt nhất được sử dụng để
cập nhật thông tin về công ty là Crunchbase, nó được tạo ra và cập nhật thông tin bởi
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


21
Phan Đình Duy

cộng đồng người sử dụng nó. Chúng ta sẽ sử dụng nó để cập nhật thêm thông tin cho
công ty trong kho dữ liệu của chúng ta.
Ví dụ, ứng với Crunchbase keys là metawebtechnologies chúng ta sẽ có URI truy
xuất dữ liệu của nó ra dạng JSON như sau, khi gõ vào trình duyệt


Hình 2-7 Kết quả truy xuất tìm thông tin về công ty trên Crunchbase dựa vào keys
Chúng ta sẽ thực hiện việc cập nhật này bằng code tự tạo trong module
crunchbase_data.py.
fromrdflibimportConjunctiveGraph
fromrdflibimportNamespace,BNode,Literal,RDF,URIRef
frompysesameimportconnection

importurllib
fromsimplejsonimportloads
# Connecion to Sesame
con=connection('http://localhost:8180/openrdf-sesame/')
con.use_repository('joblistings')
con.addnamespace('rdfs','
JB=Namespace("
DC=Namespace("
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


22
Phan Đình Duy

FOAF=Namespace("
cg=ConjunctiveGraph()
cg.bind('dc',DC)
cg.bind('jobboard',JB)
cg.bind('foaf',FOAF)
# tìm uri seeAlso có chứa từ crunchbase
res=con.query('select ?id ?url where {?id rdfs:seeAlso ?url . FILTER regex(?url,
"crunchbase")}')
# Loop over the results
forrowinres:
company=URIRef(row['id']['value'])
url=row['url']['value']
data=urllib.urlopen(url).read() # load nội dung dạng JSON
record=loads(data)
# Bổ sung thông tin location vào company được lấy từ nội dung truy xuất
forlocinrecord['offices']:

ifloc['city']andloc['state_code']:
cityid='%s_%s'%(loc['city'].lower().replace(' ','_'),loc['state_code'].lower())
cg.add((company,JB['location'],JB[cityid]))
# Bổ sung home page
cg.add((company,FOAF['homepage'],Literal(record['homepage_url'])))
# Add funding rounds
forfrinrecord['funding_rounds']:
round=BNode()
cg.add((company,JB['funding_round'],round))
cg.add((round,JB['amount'],Literal(fr['raised_amount'])))
cg.add((round,DC['date'],Literal(str(fr['funded_year']))))
Sau khi thực thi module này chúng ta sẽ có tập tất cả các thông tin bổ sung ứng với
mỗi company trong đồ thị mới là cg (đồ thị này chỉ cập nhật thông tin company có trong
kho sesame và thông tin bổ sung.
Đẩy nội dung của đồ thị này lên kho seasame
BIỂU DIỄN TRI THỨC & ỨNG DỤNG


23
Phan Đình Duy


Hình 2-8 Nội dung của đồ thị trên kho seasame
Các thông tin mới đã được cập nhật trên hệ thống của chúng ta

Hình 2-9 Thông tin bổ sung đã được cập nhật
Cập nhật tương tự cho thông tin finance trong yahoo_finance_update.py.
Nếu bạn đầu chúng ta không đưa thông tin crunchbase vào kho dữ liệu của chúng ta,
thì chúng ta có thể cập nhật chúng dựa trên dịch vụ của freebase dưới namespace tên gọi
là metaweb, như ví dụ trong freebase_companies.py.

×