Ultimate mashup – Các dịch vụ Web và Web ngữ nghĩa (semantic Web), Phần 3: Hiểu về RDF và ngôn ngữ lược đồ RDF

Xây dựng và diễn giải Khung Mô tả Tài nguyên (Resource Description Framework - RDF) và Ngôn ngữ Lược đồ RDF (RDF Schema Language - RDFs)

Sức mạnh của Ultimate mashup là trí tuệ mà bạn phát triển bằng cách sử dụng các kỹ thuật Web ngữ nghĩa, đặc biệt là Web ngôn ngữ bản thể luận (Web Ontology Language - OWL). Nhưng trước khi bạn có thể sử dụng OWL, bạn cần quen với ngôn ngữ cơ bản của chương trình này, đó là Resource Description Framework (RDF) và RDF Schema Language (RDFs). Hướng dẫn này sẽ cung cấp cho bạn kiến thức cơ bản khá tốt về cả RDF và RDFs để bạn sẵn sàng xây dựng các bản thể luận (ontologies) cho công việc phát triển Web của bạn, và cũng có thể tận dụng sức mạnh của RDF cho các dự án khác.

Nicholas Chase, Tác giả tự do, Site Dynamics Interactive Communications

Nicholas Chase đã phát triển trang web cho các công ty lớn như Lucent Technologies, Sun Microsystems, Oracle, và Tampa Bay Buccaneers. Nick đã từng là một giáo viên vật lý ở trường phổ thông, một nhà quản lý thiết bị phóng xạ mức thấp, một nhà biên tập tạp chí khoa học viễn tưởng trực tuyến, một kỹ sư đa phương tiện, một hướng dẫn của Oracle, và một trưởng phòng công nghệ của một công ty tương tác truyền thông. Nick là tác giả của một số sách



08 03 2007 (Xuất bản lần đầu tiên vào ngày 20 05 2009)

Trước khi bạn bắt đầu

Hướng dẫn này là dành cho các lập trình viên phát triển web, những người quan tâm tới việc học về RDF (Resource Description Framework), cũng như dành cho những ai quan tâm tới việc học thêm về Web ngữ nghĩa và các dịch vụ Web ngữ nghĩa nói chung và xây dựng các bản thể luận nói riêng. Bạn sẽ học cách xây dựng và truyền tải thông tin RDF ở cả dạng XML phổ biến và dạng dùng nhanh phi XML.

Hướng dẫn này không liên quan tới lập trình, nhưng giả định là bạn đã quen với các khái niệm XML.

Về loạt bài này

Có vẻ như ngày nay bạn không thể quay lưng lại với Web mà không vào một trang web mà nó cho phép truy cập vào dữ liệu trên trang web thông qua dịch vụ dựa trên nền Web API hoặc sử dụng dữ liệu từ một trang khác thông qua dịch vụ Web API. Khi bạn cân nhắc lợi ích của việc sử dụng thông tin hiện có trong các ứng dụng của riêng bạn thì điều này có thể không quá bất ngờ. Điều này cũng từng chỉ là vấn đề về thời gian trước khi ai đó đã bắt đầu kết hợp các thông tin từ các hệ thống tách biệt để tạo nên một thứ gì đó hoàn toàn mới. Những ứng dụng này, được gọi là mashup, là cái mới nhất trên Web, từ các trang tập trung vào cộng đồng tới các trang tìm kiếm đặc thù và cho tới các mashup ánh xạ hiện thời (ever-present mapping mashups).

Mashup hầu hết đều hữu dụng, nhưng có một vấn đề mà chúng thường hay có đó là chúng đều được phát triển cho tập hợp các dịch vụ cụ thể. Nếu một trong những dịch vụ đó thay đổi, hoặc nếu sự ưa chuộng đối với một dịch vụ cụ thể của một loại hình nào đó thay đổi thì bạn sẽ phải làm rất nhiều việc.

Mục tiêu của loạt bài hướng dẫn này đó là tạo ra một trình ứng dụng mashup thông minh tới mức người sử dụng có thể thêm bớt các dịch vụ nếu muốn, và hệ thống sẽ biết làm gì với chúng. Các tiến trình của loạt bài như sau:

Trong Phần 1, tôi đã giới thiệu khái niệm của mashup, đã chỉ ra cách thức chúng vận hành và phát triển một phiên bản đơn giản của chúng. Bạn cũng đã tìm ra các vấn đề nghiêm trọng trong vận hành có liên quan tới việc tạo ra hàng loạt cuộc gọi trên Web.

Ở Phần 2, bạn sẽ giải quyết một vài vấn đề trong đó bằng cách sử dụng tính năng pureXML™ mới của DB2® để xây dựng nơi lưu trữ, là chỗ lưu các kết quả của các yêu cầu từ trước đó và cũng cho phép bạn tìm lại các thông tin nào đó.

Trước tiên, bạn cần sử dụng các bản thể luận, hoặc từ vựng xác định khái niệm và mối quan hệ của chúng, vì vậy ở đây trong Phần 3 bạn sẽ bắt đầu quy trình đó bằng cách tìm hiểu về RDF và RDFS, là hai nhân tố chính trong OWL (Web Ontology Language) mà tôi sẽ thảo luận trong Phần 4. Trong Phần 5, bạn sẽ lấy các bản thể luận được tạo ra ở Phần 4 và sử dụng chúng để cho phép người sử dụng thay đổi các nguồn thông tin.

Trong Phần 6, mọi thứ sẽ thực sự thú vị. Về điểm này thì bạn có một trình ứng dụng đang hoạt động và khung đúng chỗ để hệ thống có thể sử dụng lập luận ngữ nghĩa để hiểu được dịch vụ tại vị trí của nó. Trong phần này, bạn cho phép người dùng kiểm soát, cho phép họ lấy và lựa chọn dữ liệu mà sẽ được sử dụng cho một mashup tùy biến.

Về bài viết này

Trong phần trước của loạt bài này, bạn đã tạo ra nền tảng của mashup: servlet mà kiểm tra bộ đệm lưu trữ (cache) cơ sở dữ liệu và hiển thị dữ liệu lưu trữ hoặc làm mới. Bây giờ bạn cần bắt đầu đưa "ngữ nghĩa" vào Web. Trong Phần 4, bạn sẽ tạo ra một bản thể cho phép bạn thực thi logic trong các dịch vụ của bạn, nhưng trước hết bạn cần hiểu được ngôn ngữ mà bạn sẽ làm việc với bản thể luận đó, RDF - Resource Description Framework.

Bài viết này giúp bạn theo được với RDF và các nhánh của nó, lược đồ RDF. Trong hướng dẫn này, bạn sẽ tìm hiểu về:

  • RDF là gì và được sử dụng để làm gì
  • Mối quan hệ giữa RDF, lược đồ RDF, OWL, và Web ngữ nghĩa
  • Kiến thức cơ bản về RDF
  • Xử lý các nguồn, thành phần, và các cấu trúc RDF khác
  • Thể hiện RDF trong XML – và khi không có nó
  • Tạo các lớp và ví dụ sử dụng lược đồ RDF

Trong bài viết này, bạn sẽ xem qua những cấu trúc này từ quan điểm của việc biểu diễn các thành phần và dữ liệu của bạn từ ứng dụng mashup của bạn.

Các điều kiện tiên quyết

Mặc dù bạn không cần các cấu phần phần mềm để mashup tự chạy – xem danh sách các yêu cầu đối trong phần 2 (xem Tài nguyên)-- bài này chủ yếu bàn về các khái niệm vì vậy bạn không cần một phần mềm cụ thể nào cả.


Khái quát nhanh

Trước khi bạn tiếp tục đi sâu, chúng ta hãy trao đổi về ví dụ ứng dụng mashup, Web ngữ nghĩa, RDF và các bản thể luận.

Nhìn lại các phần trước

Một mashup là một ứng dụng và nó lấy dữ liệu, thường là dữ liệu dịch vụ Web, và thường lấy từ nhiều nguồn – và nó được sử dụng để tạo ra một chương trình mới nào đó. Cho tới nay, để bạn tạo được Ultimate mashup, bạn đã tạo một hệ thống mà nó thể hiện thông tin cho một số bất kỳ các dịch vụ Web và trình bày thông tin đó trên trang Web.

Ứng dụng được xây dựng để trở thành chung nhất có thể. Bạn có thể xác định các dịch vụ theo lớp riêng của chúng, với một mảng các dịch vụ cần thể hiện. Để thêm hoặc bớt dịch vụ từ đầu ra cuối cùng, bạn có thể tạo nội dụng của mảng đó, và một mẫu XML mà xác định bản trình bày mới nhất sẽ kèm theo một định nghĩa về dịch vụ.

Kết quả cuối cùng đó là bạn có thể kiểm soát các dịch vụ được sử dụng, nội dung trình bày của dữ liệu trên trang Web cuối cùng, và thậm chí các dịch vụ con được kết nối với dịch vụ chính bằng cách đơn giản là chế tác các lượng thông tin vào các hướng dẫn đầu vào.

Lý do tôi làm mọi điều trở lên chung chung một phần là để có được sự linh hoạt và khả năng bảo trì, và một phần là để chuẩn bị trình ứng dụng cho những gì sẽ tới tiếp theo.

Vào cái sẽ tới tiếp theo đó là một cách thức mới để tìm kiếm thông tin.

Tiếp theo là Web ngữ nghĩa

Ngay bây giờ, khi bạn tìm tới một công cụ tìm kiếm như Google và nhập từ để tìm thì thật khó để đoán được chính xác là bạn sẽ nhận lại thông tin thế nào. Nếu bạn nhập từ "SOAP", có phải bạn sẽ nhận được một loạt các tài liệu trên các dịch vụ Web, hoặc những chỉ dẫn về việc giặt là? Hoặc có phải là một thông tin cập nhật rằng ai đã giết nhân vật Greg Madden trong tập phim truyền hình "Bọn trẻ của tôi"?

Google làm được nhiều trong việc tìm ra một trang Web nào đó thuộc về ví dụ nào bằng cách xem trang nào được kết nối tới, nhưng kết cục là chuỗi "SOAP" chỉ là một chuỗi các chữ cái, và để nhận rõ ý nghĩa và nội dung của từ đó là một nhiệm vụ mà hiện nay tốt nhất là để dành lại cho bộ não của con người.

Nhưng mọi thứ đều khác trên Web ngữ nghĩa. Trên Web ngữ nghĩa, thông tin được xác định theo cách mà có thể máy móc hiểu được, và cho phép phần mềm xử lý quy trình này.

Một ví dụ thường được sử dụng để trao đổi trong trường hợp này có liên quan tới việc sắp xếp chuyến du lịch hoặc các công việc khác. Trên Web ngữ nghĩa, một đại lý thông minh có thể kiểm tra kế hoạch của bạn, có thể giúp bạn tìm một chuyên gia phù hợp với một cuộc hẹn gặp mà bạn có thể thiết lập, có thể lấy đánh giá từ các bệnh nhân cũ và bệnh nhân hiện thời, và có thể thu xếp một người giữ trẻ để trông nom con bạn khi bạn đi vắng.

Tất cả các ví dụ này đều có khả năng thực hiện chỉ khi thông tin được đưa lên Web ngữ nghĩa được xác định bằng máy cách mà máy có khả năng đọc và hiểu.

Nhưng ở đây là thủ thuật. Web ngữ nghĩa không phải là một sân chơi mới mẻ nào đó mà ở đó những người sử dụng cần phải loại bỏ Web hiện thời. Không phải vậy, Web ngữ nghĩa chỉ là trang Web hiện thời, nhưng với nhiều thông tin hơn.

Các dịch vụ Web ngữ nghĩa

Nếu bạn đưa các dịch vụ web vào mashup và dữ liệu của chúng theo cách này, với nhiều thông tin hơn thì bạn có thể cho phép trình ứng dụng tạo ra các lựa chọn thông minh. Ví dụ, trình ứng dụng có thể hiểu được dịch vụ nào thể hiện thông tin bản đồ, và dịch vụ nào thể hiện các cửa hàng trực tuyến, hay thậm chí là sâu hơn, các cửa hàng sách trực tuyến. Nó sẽ biết thông tin nào từ các dịch vụ đó thể hiện tiêu đề, nội dung mô tả, giá cả và các thông tin khác nữa.

Đó là các dịch vụ hứa hẹn của Web ngữ nghĩa; một hệ thống hiểu được ý nghĩa đằng sau các thông tin, làm cho thông tin có thể sử dụng được theo những cách cụ thể.

Trong hướng dẫn này, nó có nghĩa những người sử dụng của bạn có thể tự động hoán đổi các dịch vụ cùng loại – ví dụ như sử dụng Barnes và Noble thay vì Amazon -- hoặc thậm chí tạo những mashup mới của riêng họ.

Cấu trúc mà bạn xác định thông tin này được gọi là bản thể luận.

Các bản thể luận

Trong cuốn sách Website Indexing 2nd Edition, Glenda Browne và John Jermey định nghĩa từ bản thể luận như sau:

"Bản thể luận: Đặc tả kỹ thuật của việc khái quát hóa một miền kiến thức. Một bản thể luận là các từ vựng được kiểm soát mà nó mô tả các đối tượng và các mối quan hệ giữa chúng theo một cách chính thức, và có phần ngữ pháp để sử dụng các thuật ngữ trong từ vựng để diễn giải điều gì đó có nghĩa trong một khoảng xác định. Từ vựng được sử dụng để tạo các yêu cầu và các xác nhận. Các cam kết thuộc bản thể luận là các thỏa thuận để sử dụng từ vựng theo cách ổn định để chia sẻ kiến thức. Các bản thể luận có thể bao gồm các các danh sách từ (glossaries), các phân loại (taxonomies) và các từ đồng nghĩa (thesauri), nhưng thông thường có cách diễn giải tốt hơn và các quy định chặt chẽ hơn các công cụ này. Một bản thể luận chính thức là một từ vựng được kiểm soát đã được diễn giải theo một ngôn ngữ thể hiện bản thể."

Nói cách khác, một bản thể luận là một cách thức được thỏa thuận để diễn đạt các ý tưởng cụ thể. Vì vậy, nếu tôi muốn làm cho thông tin của trang cá nhân của tôi sẵn có, tôi có thể đưa lên các thông tin kiểu như thế này (xem Ví dụ 1):

Ví dụ 1. Thông tin được mã hóa sử dụng Dublin Core
<rdf:RDF 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">

<rdf:Description rdf:about="http://www.chaosmagnet.com/blog">

<b><dc:creator>Nicholas Chase</dc:creator>
<dc:title>Chaos Magnet</dc:title>
<dc:description>The personal and professional ramblings 
of technology author Nicholas Chase</dc:description> 
<dc:date>2006-06-30</dc:date></b>

</rdf:Description> 
</rdf:RDF>

Thông tin này được thể hiện bằng cách sử dụng các thuật ngữ từ một cấu trúc được gọi là Dublin Core. Dù bạn có thể gọi Dublin Core một bản thể luận lại để tranh luận hoặc không, nhưng chắc chắn là mọi người sẽ đồng ý răng ý nghĩa về ngữ nghĩa của người sáng tạo, tiêu đề, ngày tháng và các thông tin khác nữa.

Trong trường hợp này, bạn có thể tạo ra một bản thể luận mà có thể xác định được các khái niệm ví dụ như:

  • Dịch vụ
  • Bản đồ
  • Cửa hàng
  • Cửa hàng sách
  • Giá cả
  • Bình luận
  • Hình ảnh
  • Ảnh thu nhỏ
  • Tiêu đề

Sau đó bạn có thể xác định các dịch vụ hoặc dữ liệu đơn lẻ như "các ví dụ" của một trong các khái niệm này. Để làm được điều này, bạn sẽ sử dụng Ngôn ngữ Bản thể luận Web (OWL).

Ngôn ngữ Bản thể luận Web (OWL)

Vâng tôi biết. Từ ghép đối với Ngôn ngữ Bản thể luận Web nên là WOL chứ không phải là OWL. Nhưng lại không phải vậy, lý do là từ các tham chiếu tới Winnie the Pooh (và Owl khôn ngoan, người đã đánh vần tên mình là W-O-L) cho tới sự tôn trọng các dự án bản thể luận trước đó như Ngôn ngữ một thế giới (One World Language) của Bill Martin cho tới thực tế rằng thật dễ dàng để nói và để thiết kế những nhãn hiệu dành cho "OWL" hơn là cho "WOL".

Không vấn đề gì, và bây giờ cái đó đã được bỏ qua, vậy chính xác đó là gì?

One World Language, hay viết tắt là OWL, cung cấp một từ vựng để xác định thông tin trên Web theo cách mà các máy móc có thể diễn giải được nó. Hãy xem xét ví dụ này (xem Ví dụ 2):

Ví dụ 2. Một bản thể luận (rất) đơn giản
<rdf:RDF
xmlns     ="http://www.example.com/mashup#"
xml:base  ="http://www.example.com/mashup#"
xmlns:owl ="http://www.w3.org/2002/07/owl#"
xmlns:rdf ="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"> 

<owl:Class rdf:ID="Store">
<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>

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

Mã trong ví dụ 2 tạo ra một loại đối tượng chính, một cửa hàng Store, và một lớp con, cửa hàng sách Bookstore. Sau đó bạn có thể sử dụng loại mới đó để xác định Amazon.com là một Bookstore.

Không quá thú vị cho tới khi bạn xem xét thấy rằng OWL cũng cho phép bạn tạo hàng loạt các xác nhận về các Bookstore, ví dụ như thực tế là chúng có thể truy cập trực tuyến, chúng bán sách (cái mà bạn có thể xác định theo kiểu riêng của bạn), mà bạn cũng có thể bán các loại hàng khác, và hơn thế nữa. Bằng cách xác định Amazon.com là một Bookstore, tất cả những thông tin đó tự động gắn với nó.

Bạn sẽ tìm hiểu mọi thứ về OWL trong Phần 4 của loạt bài này, nhưng trước khi bạn tới đó, bạn cần gọi tên dạng thức của thông tin, đó là Khung Mô tả Tài nguyên (Resource Description Framework).

Khung Mô tả Tài nguyên (RDF)

Khung Mô tả tài nguyên là một cách thức rõ ràng để nêu thông tin về thứ gì đó. Nhiều người cho rằng nó quá phức tạp, nhưng khi bạn nhìn nhận đúng về nó thì RDF chỉ là cách để xác định đặc tính của các nguồn. Quay trở lại ví dụ trang web cá nhân (xem Ví dụ 3):

Ví dụ 3. Xác định đặc tính của các nguồn
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:dc="http://purl.org/dc/elements/1.1/">

    <rdf:Description rdf:about="http://www.chaosmagnet.com/blog">

        <dc:creator>Nicholas Chase</dc:creator>
        <dc:title>Chaos Magnet</dc:title>
        <dc:description>The personal and professional ramblings 
                          of technology author Nicholas Chase</dc:description> 
        <dc:date>2006-06-30</dc:date>

    </rdf:Description> 
</rdf:RDF>

Trong ví dụ 3, mã tạo ra một mô tả Description đó là về một nguồn http://www.chaosmagnet.com/blog. Mã xác định bốn đặc tính, dc:creator, dc:title, dc:Description, và dc:date, và giá trị của các đặc tính đó. Trong hướng dẫn này, tôi sẽ dùng các đồ thị và các bộ ba (triples) và các nguồn và tất cả các thứ mà có thể làm cho RDF dường như quá phức tạp, nhưng cuối cùng, đây là những gì mà thực sự là nó: gán các đặc tính vào các nguồn theo một cách được thỏa thuận trước.

Lược đồ khung mô tả tài nguyên (RDFs)

Như tôi đã nói, RDF là một cách để gán các đặc tính vào các nguồn, và chỉ có vậy. Bản thân RDF thậm chí không gán bất cứ nghĩa nào vào các đặc tính đó. Bất cứ nghĩa nào trong một tài liệu RDF đến từ các đặc tính, và không phải từ RDF. Không may là điều này có nghĩa là bản thân RDF không phải là rất hữu dụng đối với các công việc như định nghĩa các từ vựng, trong đó bạn cần một cách thức để xác định ít nhất là các quan hệ giữa các khái niệm.

Nhập lược đồ RDF. Một phần của nhóm các đặc tả được cho là "Bản khuyến nghị của RDF", lược đồ RDF cung cấp cách thức để tạo ra những quan hệ cơ bản để xác định từ vựng. Hãy xem ví dụ này (xem ví dụ 4):

Ví dụ 4. Một ví dụ đơn giản về lược đồ RDF
<rdf:RDF
    xmlns     ="http://www.example.com/mashup#"
    xml:base  ="http://www.example.com/mashup#"
    xmlns:rdf ="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">

<rdfs:Class rdf:ID="Service">
    <rdfs:label>Web Service</rdfs:label>
</rdfs:Class>

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

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

<rdf:Property  rdf:ID="endpoint">
    <rdfs:domain rdf:resource="#Service"/>
    <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#anyURI"/>
</rdf:Property>

<Bookstore rdf:ID="Amazon.com">
    <endpoint>
        http://soap.amazon.com/onca/soap?Service=AWSECommerceService
    </endpoint>
</Bookstore>
</rdf:RDF>

Trong ví dụ 4, mã tạo ra ba lớp Class và một đặc tính Property, endpoint. (Tôi sẽ không thảo luận về OWL cho tới Phần 4.) Bạn có thể gán đặc tính đó vào bất kỳ dịch vụ Service nào (điều này nghĩa là có thể áp dụng vào Bookstore, như một lớp con của Store, một lớp con của Service) và cần một giá trị anyURI như đã được định nghĩa bởi bản khuyến nghị của Sơ đồ XML.

Lược đồ RDF cung cấp các khái niệm này như một tập hợp các khối cơ bản (building block) mà bạn có thể sử dụng để phát triển các ngôn ngữ và bản thể luận mới. Trong Phần 4, chúng ta sẽ xem cách thức mà các khái niệm của RDF đưa vào để tạo thành OWL, nhưng trước hết, trong hướng dẫn này, bạn sẽ tìm ra cách thức mà nó vận hành.

Hãy bắt đầu với RDF.


Cơ bản về RDF

Tôi đã thấy các lập trình viên với nhiều năm kinh nghiệm đã tức tưởi khi bắt đầu xử lý trên RDF, nhưng nó thực sự không khó khăn như vậy. Trong phần này, bạn sẽ tìm hiểu những kiến thức cơ bản để bạn cũng có thể nói được rằng "Hãy vượt qua nó, nó không quá khó đâu."

Các nguồn RDF

Cái tên Khung Mô tả Tài nguyên cho bạn thấy thực tế rằng bạn đang mô tả các tài nguyên, nhưng thực ra chúng là thế nào?

Một nguồn có thể là về bất cứ thứ gì, cho dù nó hữu hình (như một người), hay vô hình, ví dụ như chức danh hay cơ hội. Điều quan trọng là bạn cẩn có thể tham chiếu nó và sử dụng định danh của nguồn đồng nhất (Uniform Resource Identifier-URI). Một loại URI là địa chỉ tài nguyên đồng nhất (Uniform Resource Locator-URL), là những thứ mà bạn đã quen thấy trên Internet, như trên http://www.ibm.com hay mailto:ibmquestions@nicholaschase.com. Nhưng các URI cũng có thể chung chung hơn, ví dụ như urn:backstopmedia, đây là tên nguồn đồng nhất (Uniform Resource Name-URN) thay vì là URL.

Điều này nghĩa là bạn có thế sử dụng các URL để xác định các nguồn như các trang Web và hộp thư điện tử -- các nguồn trong đó một URL có thể cung cấp thông tin khi tìm kiếm nó – và các URN để xác định các nguồn khác. Ví dụ, bạn có thể quyết định xác định một người (ít nhất ở Hoa Kỳ) với một URN tham chiếu Số An ninh Xã hội của họ, như trong ssn:078-05-1120. Dĩ nhiên, trong thời đại ăn cắp thông tin cá nhân này thì bạn có lẽ không muốn làm như vậy, vì vậy bạn thường gặp những người được tham chiếu như một URL với một ý nghĩa đã được thỏa thuận trước nào đó, ví dụ như địa chỉ trang chủ trang web của họ (http://www.nicholaschase.com) hoặc URL nội bộ (ví dụ như http://www.example.com/employees/empto1138.html).

Một điều quan trọng đó là bạn cần có khả năng xác định nguồn với một loại URI nào đó. Dạng thức mà cuối cùng nó thể hiện không quan trọng.

Đặc tính RDF

Để mô tả một nguồn mà sử dụng RDF, hãy gán cho nó các đặc tính. Bạn có thể phân giai đoạn gán các đặc tính này thành các câu. Ví dụ (xem Ví dụ 5):

Ví dụ 5. Gán các đặc tính
Nick's blog has a name of Chaos Magnet
Nick's blog has a creator of Nicholas Chase

Trong mỗi một câu này, bạn có một chủ thể (Nick's blog) một tính chất (has a name, has a creator) và một chủ thể (Chaos Magnet, Nicholas Chase). Chủ thể này đại diện cho nguồn, tính chất, thuộc tính, và chủ thể giá trị của đặc tính. Vì vậy nếu bạn chuyển các câu này sang dạng nào đó gần với một RDF triple, bạn sẽ nhận được những thứ được chỉ ra trong Ví dụ 6:

Ví dụ 6. Phân chia các mục
Nick's blog           name             Chaos Magnet    .
Nick's blog           creator          Nicholas Chase  .

Dĩ nhiên, tôi thể hiện nguồn như một URI, vì vậy thay vào đó nó sẽ là thứ gì đó giống như (xem Ví dụ 7):

Ví dụ 7. Thể hiện các nguồn dưới dạng như các URI
http://www.chaosmagnet.com     name      Chaos Magnet      .
http://www.chaosmagnet.com     creator   Nicholas Chase    .

Đây vẫn không thực sự là một RDF triple bởi vì nó có một chuỗi nguyên dành cho các đặc tính. Vấn đề ở đây là các đặc tính, giống như các nguồn, cần được thể hiện dưới dạng như một URI.

Các tham chiếu URI

Thực ra, bạn thể hiện các đặc tính dưới dạng như một tham chiếu URI, hay viết tắt là URIref, là cái bao gồm cơ sở của đặc tính – theo phương thức thực tế, tên trống mà đặc tính đó thuộc về -- được tiếp theo bởi một phân đoạn (fragment).

Ví dụ, trong ví dụ 7, tôi đã tham chiếu tới thuộc tính creator. Thực ra, đây là thuộc tính creator được xác định bởi không gian tên Dublin Core, vì vậy tham chiếu URIref đầy đủ sẽ là (xem ví dụ 8):

Ví dụ 8. URIref đầy đủ cho tên khởi tạo
http://purl.org/dc/elements/1.1/#creator

Nếu bạn là một lập trình viên phát triển Web, thì cú pháp cuối cùng, phân đoạn bắt đầu với ký hiệu dấu thăng (#) có thể thấy quen thuộc. Cùng cú pháp mà bạn dùng để gửi trình duyệt tới một điểm nhất định trên trang web, ví dụ như (xem ví dụ 9):

Ví dụ 9. URL, bao gồm phân đoạn
https://www6.software.ibm.com/developerworks/education/ws-understand-
web-services3/#N1014F

Để tạo điểm đó trên trang web, bạn có thể tạo một thẻ neo (anchor tag) của (xem ví dụ 10):

Ví dụ 10. Tạo một thẻ neo
<a name="N1014F">:</a>

Với sự trông đợi của XHTML, phiên bản XML của HTML, bản này đổi thành (xem Ví dụ 11):

Ví dụ 11. XHTML thẻ neo
<a id="N1014F" />

Vì vậy đoạn tham chiếu tới yếu tố đó là ký hiệu dấu thăng (#) và do vậy là giá trị của thuộc tính ID. (Đối với những ai đã quen với XPointer, điều này có thể đã rõ.) Sau này khi bạn tạo các nguồn sử dụng rdf:ID attribute, bạn sẽ thấy lại phần này, nhưng bây giờ quan điểm của tôi đó là một URIref là một URL, có thể với một đoạn đính kèm.

Đó cũng chỉ là một cách có thể chấp nhận được để xác định một đặc tính RDF. Vì vậy các câu sẽ thành (xem ví dụ 12):

Ví dụ 12. Các đặc tính dưới dạng như các URIrefs
http://www.chaosmagnet.com  http://example.com#name  Chaos Magnet  .
http://www.chaosmagnet.com  http://purl.org/dc/elements/1.1/#creator 
                                                 Nicholas Chase    .

Trong một số trường hợp, bạn muốn viết tắt tất cả những thứ đó, vậy bạn có thể gán một tiền tố để thể hiện không gian tên thực sự. Việc này cho phép bạn cắt các câu xuống ví dụ 13:

Ví dụ 13. Cắt ngắn các câu
http://www.chaosmagnet.com  ex:name       Chaos Magnet      .
http://www.chaosmagnet.com  dc:creator    Nicholas Chase    .

Đây gần hơn với dạng RDF thực sự, nhưng chưa hẳn ở đó.

Các giá trị đặc tính

Cho tới nay tất cả các đặc tính mà bạn đã thấy đều có các giá trị chuỗi đơn giản, nhưng trên thực tế các trường hợp đó là thiểu số. Để hiểu được tại sao, bạn cần xem xét mọi thứ theo ngữ nghĩa đen. Khi tôi nói "trang web cá nhân của Nick có một tên khởi tạo là 'Nicholas Chase'", đó thực chất là một câu không có ý nghĩa lắm. Một chuỗi các chữ cái ("Nicholas Chase") đã không tạo trang web cá nhân của tôi (thậm chí nếu nó dường như đôi lúc theo cách như vậy). Ý tôi thực sự muốn nói đó là "Nguồn được biết tới là “trang web cá nhân của Nick's” đã được tạo ra bởi nguồn được biết đến là 'Nicholas Chase'."

Vì vậy, triple thực sự có thể giống một số thứ hơn điều này (xem ví dụ 14):

Ví dụ 14. Tiến gần hơn tới triple
http://www.chaosmagnet.com dc:creator  http://www.nicholaschase.com

Bạn có thể thể hiện điều này trong một đồ thị RDF.

Đồ thị RDF

Một cách để thể hiện tất cả thông tin này là thông qua việc sử dụng các đồ thị RDF. Trong các đồ thị này, bạn có thể thấy mọi thứ khớp với nhau như thế nào. Ví dụ, xem Hình 1:

Hình 1. Một đồ thị RDF
Một đồ thị RDF

Các nútt hình ô van thể hiện các nguồn, với các mũi tên giữa các hình thể hiện các đặc tính. Giá trị các đặc tính mà các nguồn được chỉ ra bằng các hình ôvan, với các giá trị theo nguyên văn được chỉ ra trong các hộp.

Các ký hiệu chú giải RDF

Cho tới nay bạn đã thấy qua thông tin về RDF, nhưng bạn chưa nhìn nhận chính thức về cách thể hiện nó. Bạn có thể sử dụng các triple, trong đó nguồn các URIref được viết trong trạng thái nguyên vẹn của chúng (xem ví dụ 15):

Ví dụ 15. Các triple đầy đủ URIref
<http://www.chaosmagnet.com> <http://example.com#name> Chaos Magnet .
<http://www.chaosmagnet.com> 
            <http://purl.org/dc/elements/1.1/#creator> 
                    <http://www.nicholaschase.com> .

(Các ràng buộc khoảng trống có hiệu lực ở đây, nhưng mỗi triple thông thường được viết trên một dòng.)

Bạn cũng có thể sử dụng tốc ký, thay thế các không gian tên với các tiền tố (xem ví dụ 16):

Ví dụ 16. Ký hiệu Shorthand
@prefix ex: <http://example.com> .
@prefix dc: <http://purl.org/dc/elements/1.1/#creator> .
<http://www.chaosmagnet.com>  ex:name         "Chaos Magnet" .
<http://www.chaosmagnet.com>  dc:creator 
                        <http://www.nicholaschase.com> .

Chú ý rằng chỉ các URIrefs đầy đủ được hiển thị trong các dấu ngoặc. Có lẽ cách phổ biến nhất để xem RDF, tuy nhiên, lại như XML. Ví dụ, bạn sẽ thấy những mối quan hệ này như (xem ví dụ 17):

Ví dụ 17. Ký hiệu XML
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:ex = "http://example.com#"
    xmlns:dc="http://purl.org/dc/elements/1.1/#">

    <rdf:Description rdf:about="http://www.chaosmagnet.com">
        <ex:name>Chaos Magnet</ex:name>
        <dc:creator rdf:resource="http://www.nicholaschase.com" />
    </rdf:Description> 
</rdf:RDF>

Bạn sẽ thấy rõ hơn về cách hiển thị RDF trong XML trong phần tiếp theo.


RDF/XML

XML không phải là cách duy nhất để hiển thị RDF. Trong một số trường hợp, nhất là khi bạn cố gắng hình dung mối quan hệ giữa các nguồn và các đặc tính, thậm chí đó không phải là cách tốt nhất. Nhưng chắc chắn đó là cách thông dụng nhất, và khi được thực hiện với Web ngữ nghĩa, là cách thuận tiện nhất. Hãy xem cách thức vận hành một cách chi tiết hơn.

Mô tả các nguồn đã tồn tại

Việc sử dụng RDF phổ biến nhất đó là mô tả các nguồn đã tồn tại, ví dụ như tất cả hoặc một phần của một RSS feed. Trong các trường hợp đó, RDF được gộp trong một tài liệu XML khác và được phần biệt thông qua việc sử dụng các không gian tên XML. Tuy nhiên để đơn giản hơn, chúng ta hay xem xét riêng RDF.

Tôi sẽ bắt đầu với một tài liệu đơn giản mô tả dữ liệu được trả lại bởi một yêu cầu đối với thẻ "movies" của Technorati (xem Ví dụ 18):

Ví dụ 18. Hãy mô tả một nguồn đã tồn tại
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#">
    
    <rdf:Description rdf:about="http://www.technorati.com/tag/Movies">

        <tapi:Title>[Technorati] Tag results for Movies</tapi:Title>
        <tapi:PubDate>Sun, 30 Jul 2006 11:38:42 PST</tapi:PubDate>
        <tapi:Inboundlinks>321580</tapi:Inboundlinks> 

    </rdf:Description> 
</rdf:RDF>

Đây là một yếu tố đơn giản rdf:RDF với một mô tả Description bao gồm các đặc tính cho nguồn được mô tả trong đặc tính rdf:about. Trong trường hợp này, các đặc tính là từ không gian tên http://www.technorati.com/tag#, vì vậy nếu bạn mở rộng các không gian tên, chúng ta thấy rằng thuộc tính title, ví dụ như vậy, thực sự là thuộc tính của http://www.technorati.com/tag#Title.

Theo cách này, bạn có thể thêm bao nhiêu đặc tính vào nguồn là tùy thuộc vào bạn.

Cũng cần chú ý rằng đây không chỉ là cách để hiển thị RDF trong XML. Do bởi bạn thường kèm RDF trong các tài liệu khác, bạn luôn làm như vậy để họ không động chạm tới thông tin gốc. Tuy nhiên cách mà tôi thể hiện các dữ liệu ở đây là nếu tôi đã thêm thông tin vào trình duyệt, thì nội dung văn bản của các thành tố đó sẽ xuất hiện trên trang web. Đây chỉ là cách thức mà dĩ nhiên cần như vậy, hiển thị hành vi mặc định của trình duyệt một cách đơn giản thể hiện nội dung của bất kỳ các phiên nào mà nó không hiểu được.

Để tránh vấn đề đó, chúng ta có thể sử dụng phương pháp thay thế bằng cách sắp xếp thông tin theo các thuộc tính thay vì các thành tố. (xem Ví dụ 19):

Ví dụ 19. Dữ liệu RDF trong các thành tố
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#">
    
    <rdf:Description rdf:about="http://www.technorati.com/tag/Movies"
        tapi:Title="[Technorati] Tag results for Movies"
        tapi:PubDate="Sun, 30 Jul 2006 11:38:42 PST"
        tapi:Inboundlinks="321580" />

</rdf:RDF>

Thông tin tương tự, nhưng hiện nay nó được chứa trong các giá trị thuộc tính hơn là nội dung thành tố, và nó sẽ không được thể hiện bởi một trình duyệt.

Xác định loại dữ liệu

Đôi khi bạn muốn cụ thể hóa cách thức dữ liệu được xử lý, vì vậy thật hữu ích để có thể cụ thể một loại dữ liệu dự định. Ví dụ (xem Ví dụ 20):

Ví dụ 20. Xác định các loại dữ liệu
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#">
    
    <rdf:Description rdf:about="http://www.technorati.com/tag/Movies">

        <tapi:Title>[Technorati] Tag results for Movies</tapi:Title>
        <tapi:PubDate 
             rdf:datatype="http://www.w3.org/2001/XMLSchema#date">
          Sun, 30 Jul 2006 11:38:42 PST
        </tapi:PubDate>
        <tapi:Inboundlinks 
            rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">
            321580
        </tapi:Inboundlinks> 

    </rdf:Description> 
</rdf:RDF>

Trong trường hợp này, tôi xác định các thành tố PubDateInboundlinks nên là ngày tháng và số nguyên như đã được xác định trong đặc tả lược đồ XML. Bạn có thể nói rằng phiên bản Lược đồ XML của các loại này được dựa trên các không gian tên trong các URIref của chúng. Không có gì nói rằng bạn cần sử dụng loại dữ liệu Lược đồ XML, nhưng chúng là trong tầm tay và các trình ứng dụng XML thường đã hiểu chúng, vì vậy không có lý do gì để không sử dụng chúng.

Bạn cũng có thể hiện thị loại trong ký hiệu N3, như trong (xem Ví dụ 21):

Ví dụ 21. Xác định các loại dữ liệu trong ký hiệu N3
<http://www.technorati.com/tag/Movies> 
    <http://www.technorati.com/tag#Inboundlinks> 
        "321580"^^http://www.w3.org/2001/XMLSchema#integer .

Cần chú ý rằng bản thân RDF không đóng vai trò gì để bắt buộc hoặc duyệt các loại dữ liệu này. Không có gì có thể ngăn bạn nhập một chuỗi hoặc một số cho một URL. RDF đơn giản là cung cấp cách thức để biểu thị thông tin; trình ứng dụng RDF có trách nhiệm đảm bảo dữ liệu thích hợp.

Tham khảo các nguồn hiện thời

Đôi khi bạn chỉ mô tả các nguồn hiện thời, bạn sử dụng chúng để mô tả các nguồn khác. Ví dụ, bạn có thể thêm vào nguồn mà bạn mô tả và thêm vào đặc tính Hình ảnh. (xem Ví dụ 22):

Ví dụ 22. Tham khảo một nguồn như một giá trị đặc tính
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#">
            
    <rdf:Description rdf:about="http://www.technorati.com/tag/Movies">
            
        <tapi:Title>[Technorati] Tag results for Movies</tapi:Title>
        <tapi:PubDate 
                rdf:datatype="http://www.w3.org/2001/XMLSchema#date">
            Sun, 30 Jul 2006 11:38:42 PST
            </tapi:PubDate>
        <tapi:Inboundlinks 
            rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">
            321580
        </tapi:Inboundlinks> 
        
        <tapi:Image rdf:resource "http://static.technorati.com/pix/logos/logo_sm.gif"/>
        
    </rdf:Description> 
</rdf:RDF>

Hãy chú ý rằng bạn xác định các giá trị như một rdf:resource, và sử dụng các URI của nguồn đó như giá trị đặc tính thực sự. Tuy nhiên trong một số trường hợp, nguồn mà bạn muốn tham chiếu không được xác định bên ngoài không gian tên hiện thời. Ví dụ, sẽ ra sao nếu hình ảnh mà bạn tham chiếu không chỉ là tệp mà bạn có thể tham chiếu bằng một URL đơn, hơn là một tập hợp các đặc tính? Bạn cần một cách thức để chỉ tới định nghĩa của nguồn đó.

Để làm được điều đó, hãy tạo bản thành tố Description thứ hai và gán cho nó một nodeID (xem Ví dụ 23):

Ví dụ 23. Sử dụng các nốt ẩn danh
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#">
        
    <rdf:Description rdf:about="http://www.technorati.com/tag/Movies">
        
        <tapi:Title>[Technorati] Tag results for Movies</tapi:Title>
        <tapi:PubDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">
            Sun, 30 Jul 2006 11:38:42 PST
            </tapi:PubDate>
        <tapi:Inboundlinks rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">
            321580
        </tapi:Inboundlinks> 
        <tapi:Image rdf:nodeID="image1"/>
    
    </rdf:Description> 
    
    <rdf:Description rdf:nodeID="image1">
        <tapi:Url>
            http://static.technorati.com/pix/logos/logo_sm.gif
        </tapi:Url>
        <tapi:Title>Technorati logo</tapi:Title>
        <tapi:Link>http://www.technorati.com</tapi:Link>
    </rdf:Description>
    
</rdf:RDF>

Cần chú ý rằng bạn tạo bản thành tố Description thứ hai và gán cho nó một nodeID. Việc này cho phép bạn tạo một nguồn mà bạn có thể tham chiếu từ đặc tính tapi:image. Nó được gọi là một nodeID, bởi nếu bạn đã định lấy dữ liệu từ đồ thị RDF thì nốt image1 trong Hình 1 ở trên sẽ là nốt ôvan rỗng với đặc tính riêng của nó.

Tạo các nguồn mới

Sử dụng nodeID tạo một cách thức để tham chiếu nốt này, nhưng chỉ trong ngữ cảnh của tài liệu và không gian tên này. Tuy nhiên, đôi khi bạn muốn tạo một nguồn mà bạn có thể tham chiếu từ bất cứ đâu, bao gồm các tài liệu khác và các không gian tên khác.

Bạn có thể làm như vậy khi sử dụng thuộc tính rdf:ID (xem Ví dụ 24):

Ví dụ 24. Tạo một nguồn mới
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#">
    
    <rdf:Description rdf:about="http://www.technorati.com/tag/Movies">

        <tapi:Title>[Technorati] Tag results for Movies</tapi:Title>
        <tapi:PubDate 
                rdf:datatype="http://www.w3.org/2001/XMLSchema#date">
            Sun, 30 Jul 2006 11:38:42 PST
            </tapi:PubDate>
        <tapi:Inboundlinks 
                rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">
                321580
        </tapi:Inboundlinks> 
        <tapi:Image rdf:resource="#image1"/>

    </rdf:Description> 
    
    <rdf:Description rdf:ID="image1">
        <tapi:Url>
            http://static.technorati.com/pix/logos/logo_sm.gif
        </tapi:Url>
        <tapi:Title>Technorati logo</tapi:Title>
        <tapi:Link>http://www.technorati.com</tapi:Link>
    </rdf:Description>

</rdf:RDF>

Hãy nhớ là tôi đã nói tới trong một tài liệu XML về cách xác định một thành tố với một thuộc tính ID cho phép bạn tạo một đoạn bằng cách tham chiếu tới nó? Còn lúc này bạn sẽ thấy nó qua thực tế. Bạn đã tạo một nguồn mới và cho nó một ID image1, điều này cho phép bạn tham chiếu nó với URI tương đối #image1.

Bây giờ hãy ghi chú lại rằng tôi đã nói nó là một URI tương đối. URI đầy đủ dành cho nguồn này là URI cơ bản cho tài liệu theo sau là một phân đoạn. Ví dụ, khi tôi chạy tài liệu này qua RDF validator, tôi nhận được một URI http://www.w3.org/RDF/Validator/run/1154295344338#image1.

Dĩ nhiên, điều này không thể dự đoán được, vì vậy bạn nên xác định URI cơ bản trực tiếp qua cách sử dụng thuộc tính xml:base (xem Ví dụ 25):

Ví dụ 25. Xác định một URI cơ bản
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#"
    xml:base="http://www.technorati.com/tag#">
    
    <rdf:Description rdf:about="http://www.technorati.com/tag/Movies">

        <tapi:Title>[Technorati] Tag results for Movies</tapi:Title>
        <tapi:PubDate 
                rdf:datatype="http://www.w3.org/2001/XMLSchema#date">
            Sun, 30 Jul 2006 11:38:42 PST
        </tapi:PubDate>
        <tapi:Inboundlinks                           
                rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">
             321580
        </tapi:Inboundlinks> 
        <tapi:Image rdf:resource="#image1"/>

    </rdf:Description> 
    
    <rdf:Description rdf:ID="image1">
        <tapi:Url>
            http://static.technorati.com/pix/logos/logo_sm.gif
        </tapi:Url>
        <tapi:Title>Technorati logo</tapi:Title>
        <tapi:Link>http://www.technorati.com</tapi:Link>

    </rdf:Description>

</rdf:RDF>

Bây giờ bạn có thể nói chắc chắn rằng không có vấn đề gì với dữ liệu được sắp xếp, URI đầy đủ dành cho nguồn ảnh sẽ là http://www.technorati.com/tag#image1. Sự nhất quán này cho phép bạn tham chiếu nguồn này từ bất kỳ đâu, bao gồm các tài liệu khác và các không gian tên khác.

Cần chú ý giá trị của rdf:ID thuộc tính phải nhất quản trong một tên trông, vì vậy bạn cần phải xác định nguồn cụ thể trông một thành tố.

Sử dụng nhiều mô tả description

Cho tới lúc này, mỗi khi bạn tạo hoặc mô tả một nguồn, nó sẽ nằm trong thành tố đơn Description, nhưng điều này không cần thiết. Bạn có thể phân chia mô tả từ thông tin gốc đầu vào thành một số thành tố Description khác nhau (xem Ví dụ 26):

Ví dụ 26. Tạo một nguồn với nhiều thành tố Description
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#"
    xml:base="http://www.technorati.com/tag#">
    
    <rdf:Description rdf:about="http://www.technorati.com/tag/Movies">
        <tapi:Title>[Technorati] Tag results for Movies</tapi:Title>
        <tapi:Image rdf:resource="#image1"/>
    </rdf:Description> 
    
    <rdf:Description rdf:about="http://www.technorati.com/tag/Movies">
        <tapi:PubDate 
                rdf:datatype="http://www.w3.org/2001/XMLSchema#date">
            Sun, 30 Jul 2006 11:38:42 PST
            </tapi:PubDate>
    </rdf:Description> 
    
    <rdf:Description rdf:about="http://www.technorati.com/tag/Movies">
        <tapi:Inboundlinks 
            rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">
            321580
        </tapi:Inboundlinks> 
    </rdf:Description> 
    
    <rdf:Description rdf:ID="image1">
        <tapi:Url>
            http://static.technorati.com/pix/logos/logo_sm.gif
        </tapi:Url>
        <tapi:Title>Technorati logo</tapi:Title>
        <tapi:Link>http://www.technorati.com</tapi:Link>
    </rdf:Description>

</rdf:RDF>

Điều thú vị đặc biệt của dạng mô tả này đó là không có giới hạn nào với nơi các thành tố Description phải có mặt. Bạn có thể tạo ra một nguồn bao gồm thông tin từ khắp nơi trên thế giới, tới khi mà mọi người liên quan có các thông tin thích hợp.

Định rõ các kiểu

Khi bạn bắt đầu xây dựng các bản thể luận, bạn sẽ bắt đầu tạo các kiểu nguồn. Ví dụ, bạn có thể tạo một kiểu Dịch vụ, một kiểu Giá cả, và các kiểu khác nữa, để bạn có thể phân loại thông tin từ các dịch vụ khác nhau. Việc phân loại thông tin này liên quan tới thiết lập thành “type” cho dữ liệu (xem Ví dụ 27):

Listing 27. Setting a date type
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#"
    xml:base="http://www.technorati.com/tag#">
    
    <rdf:Description rdf:about="http://www.technorati.com/tag/Movies">
        <rdf:type rdf:resource="http://www.example.com/mashup/Feed" />
        <tapi:Title>[Technorati] Tag results for Movies</tapi:Title>
        <tapi:PubDate 
                rdf:datatype="http://www.w3.org/2001/XMLSchema#date">
             Sun, 30 Jul 2006 11:38:42 PST
             </tapi:PubDate>
          <tapi:Inboundlinks 
                rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">
                321580
        </tapi:Inboundlinks> 
        <tapi:Image rdf:resource="#image1"/>

    </rdf:Description> 
...

Cho tới thời điểm này, đây chỉ là kiểu bất kỳ; bạn hãy xem qua các kiểu xác định khi bạn nhìn vào lược đồ RDF.

Các dạng khác: các kiểu được coi như tên thành tố

Một khi bạn xác định dữ liệu là một kiểu nhất định thì bạn có lựa chọn để diễn giải nó theo cách gọn gàng hơn là thiết lập thuộc tính rdf:type. Thay vào đó, bạn có thể sử dụng tên của loại vào chỗ của thành tố Description (xem Ví dụ 28):

Ví dụ 28. Sử dụng tên loại như tên thành tố
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#"
    xml:base="http://www.technorati.com/tag#"
    xmlns:mashup="http://www.example.com/mashup/"> 
<mashup:Feed rdf:about="http://www.technorati.com/tag/Movies">
        <tapi:Title>[Technorati] Tag results for Movies</tapi:Title>
        <tapi:PubDate  
            rdf:datatype="http://www.w3.org/2001/XMLSchema#date">
          Sun, 30 Jul 2006 11:38:42 PST
          </tapi:PubDate>
        <tapi:Inboundlinks 
            rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">
            321580
        </tapi:Inboundlinks> 
        <tapi:Image rdf:resource="#image1"/>
    </mashup:Feed>

    <rdf:Description rdf:ID="image1">
...
    </rdf:Description>

</rdf:RDF>

Đoạn mã này định nghĩa tiền tố mashup: để biểu thị không gian tên http://www.example.com/mashup/. Vì vậy bạn thiết lập kiểu dữ liệu như http://www.example.com/mashup/Feed, giống như ví dụ trước.

Dạng biểu thị các loại dữ liệu này trở nên quan trọng, và hầu như rộng khắp khi bạn bắt đầu nói về OWL, và hẹp hơn là về lược đồ RDF.

Túi (Bag), trình tự (Sequence), và thay thế (alternative)

Cho tới nay bạn đã xử lý với các đặc tính có giá trị đơn và chuyên biệt, nhưng nếu bạn đã từng xử lý với dữ liệu trong thế giới thực thì bạn biết rằng điều này không phải luôn đúng. Hầu hết các hệ thống hữu dụng nào có ít nhất một hoặc từ một tới nhiều quan hệ. Ví dụ, đầu vào mà bạn đang xem xét có thông tin về chính nó, nhưng nó cũng có hàng tá hoặc một số các thực thể liên quan tới nó.

Trong RDF, bạn có thể diễn giải các mối quan hệ này theo nhiều cách khác nhau. Cách đơn giản nhất là dùng Bag (xem Ví dụ 29):

Ví dụ 29. Diễn giải quan hệ từ một tới nhiều như một Bag
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#"
    xml:base="http://www.technorati.com/tag#"
    xmlns:mashup="http://www.example.com/mashup/">
    
    <mashup:Feed rdf:about="http://www.technorati.com/tag/Movies">
        <tapi:Title>[Technorati] Tag results for Movies</tapi:Title>
        <tapi:PubDate 
            rdf:datatype="http://www.w3.org/2001/XMLSchema#date">
          Sun, 30 Jul 2006 11:38:42 PST
          </tapi:PubDate>
        <tapi:Inboundlinks 
            rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">
            321580
    </tapi:Inboundlinks> 
    <tapi:Image rdf:resource="#image1"/>
    
    <tapi:Items> 
         <rdf:Bag> 
            <rdf:li rdf:resource="http://www.robotjohnny.com/2006/07/30/haiku- 
                                             review-lady-in-the-water/"/> 
            <rdf:li rdf:resource="http://riesje.livejournal.com/5359.html"/> 
            <rdf:li rdf:resource="http://www.vanguardreport.com/phpnuke/index.php"/> 
         </rdf:Bag> 
    </tapi:Items>

    </mashup:Feed> 
...

Về mặt nội tại, RDF đánh số mỗi một mục bên trong Bag, nhưng để thuận tiện hơn, nó cũng cung cấp thành tố rdf:li (được mô hình hóa trong danh mục HTML).

Một rdf:Bag là đúng như cách nói, khi bạn tiếp cận nó. Nó là một loạt các mục được nhóm lại với nhau và không theo thứ tự cụ thể nào. Mỗi một mục trong Bag có vai trò quan trọng như nhau.

Tất nhiên đôi khi nó không như những gì bạn mong muốn. Ví dụ, các mục được xếp đặt theo trình tự đảo ngược trình tự thời gian: thứ tự là quan trọng. Thay vào đó, để diễn giải thì bạn có thể tạo một Sequence (xem Ví dụ 30):

Ví dụ 30. Tạo một Sequence
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:tapi="http://www.technorati.com/tag#"
    xml:base="http://www.technorati.com/tag#"
    xmlns:mashup="http://www.example.com/mashup/">
    
    <mashup:Feed rdf:about="http://www.technorati.com/tag/Movies">
       <tapi:Title>[Technorati] Tag results for Movies</tapi:Title>
      <tapi:PubDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">
          Sun, 30 Jul 2006 11:38:42 PST
         </tapi:PubDate>
      <tapi:Inboundlinks rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">
          321580
      </tapi:Inboundlinks> 
      <tapi:Image rdf:resource="#image1"/>

      <tapi:Items> 
           <rdf:Seq> 
             <rdf:li rdf:resource="http://www.robotjohnny.com/2006/07/30/haiku- 
                                          review-lady-in-the-water/"/> 
             <rdf:li rdf:resource="http://riesje.livejournal.com/5359.html"/> 
             <rdf:li rdf:resource="http://www.vanguardreport.com/phpnuke/index.php"/> 
           </rdf:Seq> 
         </tapi:Items>

    </mashup:Feed> 
...

Về mặt chức năng, một rdf:Sequence thì tương tự như một rdf:Bag, nhưng khi sử dụng thì trình tự lại quan trọng. Cần chú ý rằng không có gì về bản thân RDF tạo nên sự khác biệt. RDF đơn giản là một cách thức được thỏa thuận trước để đánh dấu thông tin; bản thân trình ứng dụng cần buộc phải theo trình tự đã được duy trì.

Một gợi ý là sự xuất hiện của các quan hệ một nhiều là khi một và chỉ một phần tử trong một nhóm áp dụng. Ví dụ, bạn có thể có một tập hợp các mục theo đặc điểm mà từ đó trình ứng dụng của bạn chọn một trong số đó để thể hiện (xem Ví dụ 31):

Ví dụ 31. Sử dụng rdf:Alt
...
                <rdf:li rdf:resource="http://www.vanguardreport.com/phpnuke/index.php"/>
            </rdf:Seq>
        </tapi:Items>


        <mashup:FeaturedItem> 
              <rdf:Alt> 
                 <rdf:li rdf:resource="http://www.robotjohnny.com/2006/07/30/haiku- 
                                                 review-lady-in-the-water/"/> 
                 <rdf:li rdf:resource="http://riesje.livejournal.com/5359.html"/> 
                 <rdf:li rdf:resource="http://www.vanguardreport.com/phpnuke/index.php"/> 
              </rdf:Alt> 
           </mashup:FeaturedItem>

   </mashup:Feed> 
...

Cú pháp tương tự như rdf:Bagrdf:Alt, nhưng trong trường hợp này trình ứng dụng – cần nhớ đó là trách nhiệm của trình ứng dụng! – cần phải chọn một và chỉ một trong số các mục đã lựa chọn.

Các tập hợp

Bây giờ, cần nhớ là tôi đã nói về cách mà bạn có thể mô tả một nguồn đơn nhất sử dụng nhiều thành tố rdf:Description? Trong trường hợp đó, tất cả thông tin được tập hợp lại với nhau trong một nguồn đơn nhất. Điều này nghĩa là nếu chúng ta xác định Bag (hoặc Sequence (Seq) hoặc Thay thế (Alt)) lần hai rdf: Description có thể bổ sung các mục vào đó. Để ngăn chặn vấn đề này, bạn có thể xác định một nhóm như một Tập hợp (xem Ví dụ 32):

Ví dụ 32. Sử dụng các Tập hợp
...
                </rdf:Seq>
            </tapi:Items>
            
            
            <mashup:FeaturedItems rdf:parseType="Collection">
                <rdf:Description rdf:about="http://www.robotjohnny.com/2006/07/30/haiku-
                    review-lady-in-the-water/"/>
                <rdf:Description rdf:about=
                     "http://riesje.livejournal.com/5359.html"/>
                <rdf:Description rdf:about=
                    "http://www.vanguardreport.com/phpnuke/index.php"/>
            </mashup:FeaturedItems>


    </mashup:Feed> 
...

Trong trường hợp này, bạn xác định các nguồn cụ thể mà thuộc về Tập hợp và đánh dấu nó bằng thuộc tính rdf:parseType.

RDF xác định hai hoặc các giá trị khác parseType. Bạn có thể sử dụng giá trị Resource, như một cách khác để tạo các nốt rỗng, cũng giống như bạn dùng nodeID từ trước đó, và bạn có thể dùng giá trị Literal để tạo một thành tố mà gồm các thông tin XML ngữ pháp. Ví dụ, bạn có thể sử dụng nó để cho phép một Tóm tắt để trình diễn XHTML, hoặc để gồm cả các mẫu XML mà bạn đã sử dụng trong Phần 1 của loạt bài này (xem Tài nguyên).


Lược đồ RDF

RDF mô tả cách thức để xác định thông tin về một nguồn, nhưng bản thân thông tin không có ý nghĩa. Để xác định loại của các mục và quan hệ của chúng – ví dụ như các lớp và các lớp con – bạn cần bổ sung một số vào từ vựng của bạn. Những bổ sung đó được đóng gói trong lược đồ RDF. Lược đồ RDF(hoặc được biết tới như các RDF) có không gian tên của riêng nó và một số các thành tố và thuộc tính đã được xác định. Trong phần này, tôi xem bạn sẽ cần phải tạo ra các lớp và các đối tượng và quan hệ giữa chúng.

Tạo các lớp

Bước đầu tiền khi xác định một từ vựng là tạo các lớp. Giống như các lớp trong một ngôn ngữ hướng đối tượng, các lớp RDF cung cấp một loại mẫu mà từ đó bạn có thể tạo các đối tượng, hoặc như chúng được gọi theo cách khác trong RDF là các cá thể. Để bắt đầu, cần tạo một số các lớp liên quan tới dịch vụ của bạn (xem Ví dụ 33):

Ví dụ 33. Các lớp cơ bản
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xml:base="http://www.example.com/mashup/">
    
    <rdf:Description rdf:ID="Service">
        <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    </rdf:Description>

    <rdf:Description rdf:ID="SOAPService">
        <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    </rdf:Description>

    <rdf:Description rdf:ID="RESTService">
        <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    </rdf:Description>

    <rdf:Description rdf:ID="RSSFeed">
        <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    </rdf:Description>

</rdf:RDF>

Trong trường hợp này, bạn đã tạo ra bốn lớp. Bạn biết chúng là các lớp bởi vì bạn đã thấy chúng được đánh dấu với một loại của http://www.w3.org/2000/01/rdf-schema#Class. (Vì vậy bạn có thể sử dụng rdfs:class hơn là rdf:Description.)

Tạo các lớp con

Khi bạn xác định các lớp, bạn có thể tạo ra cá quan hệ giữa chúng. Bạn có thể làm được điều đó với rdfs:subclass của đặc tính (xem Ví dụ 34):

Ví dụ 34. Tạo các lớp con
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xml:base="http://www.example.com/mashup/">

        <rdf:Description rdf:ID="Service">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
        </rdf:Description>

        <rdf:Description rdf:ID="SOAPService">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
        <rdfs:subClassOf rdf:resource="#Service" />
        </rdf:Description>

        <rdf:Description rdf:ID="RESTService">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
        <rdfs:subClassOf rdf:resource="#Service" />
        </rdf:Description>

        <rdf:Description rdf:ID="RSSFeed">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
        <rdfs:subClassOf rdf:resource="#RESTService" />
        </rdf:Description>

</rdf:RDF>

Ở đây bạn đã xác định các lớp SOAPServiceRESTService như các lớp con của Service, và RSSFeed như một lớp con của RESTService. Điều đó nghĩa là nếu bạn xác định một cá thể như một RSSFeed, bạn biết đó cũng là một RESTService và một Service.

Tạo một ví dụ

Giờ bạn có các lớp, vậy làm cách nào để bạn tạo cá cá thể, tương tự các đối tượng trong một ngôn ngữ hướng đối tượng?

Hãy thực hiện giống như cách bạn đã tạo các nguồn từ nhiều nơi trước đó, sự khác biệt ở đây là bạn xác định các loại dựa trên các lớp mà bạn đã tạo ra (xem Ví dụ 35):

Ví dụ 35. Tạo các cá thể
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:mashup="http://www.example.com/mashup/" 
          xml:base="http://www.example.com/mashup/services">

                <rdf:Description rdf:ID="Google">
            <rdf:type rdf:resource=
                "http://www.example.com/mashup/#SOAPService"/>
        </rdf:Description>

                <rdf:Description rdf:ID="Amazon">
            <rdf:type rdf:resource=
                "http://www.example.com/mashup/#RESTService"/>
            <rdf:type rdf:resource=
                "http://www.example.com/mashup/#SOAPService"/>
        </rdf:Description>

</rdf:RDF>

Trong trường hợp này, hãy chú ý các không gian tên. Bạn đã xác định tiền tố mashup: để kết hợp không gian tên cơ bản đã được sử dụng trong các định nghĩa, và đã xác định không gian tên cơ bản mới.

Bạn đã tạo hai cá thể, Google và Amazon, và đã gán chúng với các loại. Cần lưu ý rằng dịch vụ của Amazon, dịch vụ mà chấp nhận cả hai yêu cầu REST và SOAP, thực ra có hai loại. Điều đó nghĩa là nó có các đặc tính được gán cho cả hai lớp. Cũng cần lưu ý rằng bạn có thể tiếp tục và đơn giản hóa mã này bằng cách sử dụng định dạng thay thế, khi ma bạn sử dụng tên loại như tên thành tố (xem Ví dụ 36):

Ví dụ 36. Đơn giản hóa trình bày
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:mashup="http://www.example.com/mashup/"
    xml:base="http://www.example.com/mashup/services">

        <mashup:SOAPService rdf:ID="Google">
        </mashup:SOAPService>
        
        <mashup:RESTService rdf:ID="Amazon">
            <rdf:type rdf:resource=
                "http://www.example.com/mashup/#SOAPService"/>
        </mashup:RESTService

</rdf:RDF>

Cần lưu ý rằng bạn có thể vẫn xác định nhiều lớp, nhưng bạn chỉ cần lưu ý lớp thứ hai. Bây giờ hãy xem cách thức thêm đặc tính vào các lớp này.

Tạo các đặc tính

Trong một ngôn ngữ hướng đối tượng, bạn chỉ cần tạo các đặc tính trong ngữ cảnh của lớp đó. Tuy nhiên trong các RDF, bạn đã tạo các đặc tính của riêng chúng và gán chúng vào các lớp (xem Ví dụ 37):

Ví dụ 37. Tạo các đặc tính
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xml:base="http://www.example.com/mashup/">

        <rdf:Description rdf:ID="Service">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
        </rdf:Description>
        
        <rdf:Description rdf:ID="SOAPService">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
            <rdfs:subClassOf rdf:resource="#Service" />
        </rdf:Description>

        <rdf:Description rdf:ID="RESTService">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
            <rdfs:subClassOf rdf:resource="#Service" />
        </rdf:Description>

        <rdf:Description rdf:ID="RSSFeed">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
            <rdfs:subClassOf rdf:resource="#RESTService" />
        </rdf:Description>

        <rdf:Property rdf:ID="baseUrl"> 
              <rdfs:domain rdf:resource="#RESTService" /> 
              <rdfs:range rdf:resource= "http://www.w3.org/2001/XMLSchema#anyURI"/> 
           </rdf:Property> 
           <rdf:Property rdf:ID="endpoint"> 
              <rdfs:domain rdf:resource="#SOAPService" /> 
              <rdfs:range rdf:resource= "http://www.w3.org/2001/XMLSchema#anyURI"/> 
           </rdf:Property>

</rdf:RDF>

Ở đây bạn đã tạo hai đặc tính, baseUrlendpoint, và đã xác định miền và dãy của chúng. Miễn là loại của nguồn trong đó đặc tính có thể xuất hiện, và dãy là loại của dữ liệu mà nó có thể nắm giữ.

Miền quan trọng hơn mức mà bạn có thể nhận thấy do bởi bạn có thể sử dụng nó khi lập luận. Ví dụ, bạn biết một đặc tính điểm cuối chỉ có thể xuất hiện trên một SOAPService, vì vậy nếu một cá thể có điểm cuối, bạn biết đó là một SOAPService, thậm chí nếu nó không được đánh dấu theo cách đó. Về sau này khi bạn bắt đầu xem xét các bản thể luận và gán các dịch vụ và dữ liệu của chúng vào các lớp, và ra các quyết định, khả năng này để lập luận sẽ trở nên quan trọng.

Sử dụng các đặc tính con

Cũng như bạn có thể tạo các lớp con để tạo ra các đặc tả của một lớp, bạn có thể tạo các đặc tính con để tạo ra các đặc tả của một đặc tính. Xem Ví dụ 38:

Ví dụ 38. Tạo các đặc tính con
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xml:base="http://www.example.com/mashup/">

        <rdf:Description rdf:ID="Service">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
        </rdf:Description>

        <rdf:Description rdf:ID="SOAPService">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
            <rdfs:subClassOf rdf:resource="#Service" />
        </rdf:Description>

        <rdf:Description rdf:ID="RESTService">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
            <rdfs:subClassOf rdf:resource="#Service" />
        </rdf:Description>

        <rdf:Description rdf:ID="RSSFeed">
            <rdf:type rdf:resource=
                "http://www.w3.org/2000/01/rdf-schema#Class"/>
            <rdfs:subClassOf rdf:resource="#RESTService" />
        </rdf:Description>

        <rdf:Property rdf:ID="accessUrl"> 
               <rdfs:domain rdf:resource="#Service" /> 
        </rdf:Property>

        <rdf:Property rdf:ID="baseUrl">
            <rdfs:subPropertyOf rdf:resource="#accessUrl" />
            <rdfs:domain rdf:resource="#RESTService" />
            <rdfs:range rdf:resource=
                "http://www.w3.org/2001/XMLSchema#anyURI"/>
            </rdf:Property>

        <rdf:Property rdf:ID="endpoint">
            <rdfs:subPropertyOf rdf:resource="#accessUrl" />
            <rdfs:domain rdf:resource="#SOAPService" />
            <rdfs:range rdf:resource=
                "http://www.w3.org/2001/XMLSchema#anyURI"/>
        </rdf:Property>

</rdf:RDF>

Trong Ví dụ 38, bạn đã tạo ra một đặc tính chung, accessUrl, và xác định Url cơ bản và các đặc tính của điểm cuối giống như các đặc tả của đặc tính đó. Điều này nghĩa là nếu bạn tạo accessUrl như một nguồn thì bất cứ đặc tính nào mà bạn gán cho nó cũng sẽ dùng được cho các đặc tính con.


Tóm tắt

Tóm tắt và tìm hiểu tiếp

Tại điểm này tôi đã trao đổi về Khung Mô tả Tài nguyên (RDF), RDF cung cấp một cách thức chuẩn mực để mô tả các đặc tính cho các nguồn khác nhau. Những đặc tính này bản thân chúng có thể là các nguồn, và bản thân chúng có thể có các đặc tính. Bạn đã thấy cách thức để tạo các nguồn mới và tham chiếu chúng từ các tài liệu và các không gian tên khác. Bạn cũng đã xem lược đồ RDF là cái cho phép bạn tạo các lớp và quan hệ giữa chúng với nhau.

Điều này nghĩa là bạn đã sẵn sàng phát triển một bản thể luận cho hệ thống mashup của bạn, và xác định nó bằng cách sử dụng Ngôn ngữ Bản thể luận Web (OWL).

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • Rational Web Developer: Tải một bản dùng thử để giúp cho công việc phát triển web của bạn được dễ dàng hơn.
  • DB2 Enterprise 9: Tải một bản dùng thử DB2 9 hoặc DB2 Express-C 9, một phiên bản không tính phí DB2 Express 9 cho máy chủ dữ liệu.

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Khi bạn đăng ký với trang developerWorks lần đầu tiên, một tiểu sử của của bạn được tạo ra. Chọn các thông tin về tiểu sử của bạn (tên, nước/vùng, và nơi làm việc) đã được hiện lên màn hình, thông tin này sẽ được hiện kèm với nội dung mà bạn đăng tải. Bạn có thể cập nhật thông tin này bất kỳ lúc nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Information Management, Công nghệ Java, Nguồn mở, SOA và dịch vụ Web
ArticleID=391010
ArticleTitle=Ultimate mashup – Các dịch vụ Web và Web ngữ nghĩa (semantic Web), Phần 3: Hiểu về RDF và ngôn ngữ lược đồ RDF
publish-date=03082007