Warszawa, 19 grudnia 2002
Systemy Rozproszone - seminarium magistersie na MIMUW
Karol Bieńkowski






Metadane w Internecie, czyli RDF







Co są metadane







Metadane strony WWW







Po co są?







Dlaczego są niewystarczające?







Co to oznacza?







Jakie metadane by się przydały?







Gdyby było to...







Lekarstwo na niejednoznaczności: URI







Schematy







RDF - Resource Description Framework







RDF: Model







Zasób (resource)







Własność (property)







Zdanie (statement)







Najprostsze zdanie

Przykłady i obrazki na kolejnych stronach pochodzą ze specyfikacji RDF.

Ora Lassila is the creator of the resource http://www.w3.org/Home/Lassila.

Subject (Resource) http://www.w3.org/Home/Lassila
Predicate (Property)Creator
Object (Litral)"Ora Lassila"

Uwaga: Creator powinno mieć prefiks, np. http://purl.org/metadata/dublin_core#Creator

Zdanie
owale: zasoby, prostokąty: klierały







Złożone metadane

Trzy zdania







Nazywamy anonimowy węzeł

Po co nazywać? Żeby mieć do niego dostęp.

Trzy zdania jeszcze raz







Kolekcje

Kolekcje







Jedna czy wiele własności?

Wiele własności:
Wiele

Jedna własność:






Przestrzenie nazw w XML-u







Serializacja do XML-a

Zdanie: Ora Lassila is the creator of the resource http://www.w3.org/Home/Lassila., czyli:
[http://www.w3.org/Home/Lassila] [http://description.org/schema/Creator] "Ora Lassila"

<?xml version="1.0"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:s="http://description.org/schema/">
  <rdf:Description about="http://www.w3.org/Home/Lassila">
    <s:Creator>Ora Lassila</s:Creator>
  </rdf:Description>
</rdf:RDF>






Serializacja trzech zdań

The individual referred to by employee id 85740 is named Ora Lassila and has the email address lassila@w3.org. The resource http://www.w3.org/Home/Lassila was created by this individual.

<rdf:RDF>
  <rdf:Description about="http://www.w3.org/Home/Lassila">
    <s:Creator rdf:resource="http://www.w3.org/staffId/85740"/>
  </rdf:Description>

  <rdf:Description about="http://www.w3.org/staffId/85740">
    <v:Name>Ora Lassila</v:Name>
    <v:Email>lassila@w3.org</v:Email>
  </rdf:Description>
</rdf:RDF>






Składnia zagnieżdżona

To samo zdanie co wyżej. Gdyby pominąć about="http://www.w3.org/staffId/85740" węzeł stałby się anonimowy.

<rdf:RDF>
  <rdf:Description about="http://www.w3.org/Home/Lassila">
    <s:Creator>
      <rdf:Description about="http://www.w3.org/staffId/85740">
	<v:Name>Ora Lassila</v:Name>
	<v:Email>lassila@w3.org</v:Email>
      </rdf:Description>
    </s:Creator>
  </rdf:Description>
</rdf:RDF>






Serializacja kolekcji

The students in course 6.001 are Amy, Tim, John, Mary, and Sue.

<rdf:RDF>
  <rdf:Description about="http://mycollege.edu/courses/6.001">
    <s:students>
      <rdf:Bag>
	<rdf:li resource="http://mycollege.edu/students/Amy"/>
	<rdf:li resource="http://mycollege.edu/students/Tim"/>
	<rdf:li resource="http://mycollege.edu/students/John"/>
	<rdf:li resource="http://mycollege.edu/students/Mary"/>
	<rdf:li resource="http://mycollege.edu/students/Sue"/>
      </rdf:Bag>
    </s:students>
  </rdf:Description>
</rdf:RDF>






Dublin Core Metadata Inititiative







Dublin Core







Przykład: Opis strony WWW przy pomocy schematu Dublin Core

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/metadata/dublin_core#">
  <rdf:Description about="http://www.dlib.org">
    <dc:Title>D-Lib Program - Research in Digital Libraries</dc:Title>
    <dc:Description>The D-Lib program supports the community of people
     with research interests in digital libraries and electronic
     publishing.</dc:Description>
    <dc:Publisher>Corporation For National Research Initiatives</dc:Publisher>
    <dc:Date>1995-01-07</dc:Date>
    <dc:Subject>
      <rdf:Bag>
	<rdf:li>Research; statistical methods</rdf:li>
	<rdf:li>Education, research, related topics</rdf:li>
	<rdf:li>Library use Studies</rdf:li>
      </rdf:Bag>
    </dc:Subject>
    <dc:Type>World Wide Web Home Page</dc:Type>
    <dc:Format>text/html</dc:Format>
    <dc:Language>en</dc:Language>
  </rdf:Description>
</rdf:RDF>






Przykład jak umieścić RDF na stronie HTML

<html>
<head>
  <rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:dc="http://purl.org/metadata/dublin_core#"> 
    <rdf:Description about=""> 
      <dc:Creator>
	<rdf:Seq ID="CreatorsAlphabeticalBySurname"
	  rdf:_1="Mary Andrew"
	  rdf:_2="Jacky Crystal"/>
      </dc:Creator>
    </rdf:Description> 
  </rdf:RDF>
</head>
<body>
<P>This is a fine document.</P>
</body>
</html>






Co jest, a czego nie ma w RDFie







RDF Schema







Co to jest RDF Schema







Wykorzystanie RDF Schemy

Używanie RDF Schemy





Dziedzina (domain) i przeciwdziedzina (range)







Klasy w RDFS







Własności w RDFS







RDF Schema przy pomocy RDF Schemy

Constraints





Open Directory Project







Jena - Java API dla RDF







Jena - tworzenie zasobu

// some definitions
String personURI    = "http://somewhere/JohnSmith";
String givenName    = "John";
String familyName   = "Smith";
String fullName     = givenName + " " + familyName;

// create an empty graph
Model model = new ModelMem();

// create the resource
//   and add the properties cascading style
Resource johnSmith 
  = model.createResource(personURI)
         .addProperty(VCARD.FN, fullName)
         .addProperty(VCARD.N, 
                      model.createResource()
                           .addProperty(VCARD.Given, givenName)
                           .addProperty(VCARD.Family, familyName));






Jena - wypisywanie zasobów

// list the statements in the graph
StmtIterator iter = model.listStatements();
            
// print out the predicate, subject and object of each statement
while (iter.hasNext()) {
    Statement stmt      = iter.next();         // get next statement
    Resource  subject   = stmt.getSubject();   // get the subject
    Property  predicate = stmt.getPredicate(); // get the predicate
    RDFNode   object    = stmt.getObject();    // get the object
                
    System.out.print(subject.toString());
    System.out.print(" " + predicate.toString() + " ");
    if (object instanceof Resource) {
       System.out.print(object.toString());
    } else {
        // object is a literal
        System.out.print(" \"" + object.toString() + "\");
    }
                
    System.out.println(" .");
} 






Co może Jena?







RDQL

Przykładowy model (z Jena Tutorial z hp.com):

Model do zapytań





RDQL - proste zapytania

Zapytanie:
SELECT ?x
WHERE (?x, <http://www.w3.org/2001/vcard-rdf/3.0#FN>, "John Smith")
Wynik:
x                            
=============================
<http://somewhere/JohnSmith/>
Zapytanie:
SELECT ?x, ?fname
WHERE (?x, <http://www.w3.org/2001/vcard-rdf/3.0#FN>, ?fname)
Wynik:
x                                | fname        
================================================
<http://somewhere/JohnSmith/>    | "John Smith" 
<http://somewhere/RebeccaSmith/> | "Becky Smith"
<http://somewhere/SarahJones/>   | "Sarah Jones"
<http://somewhere/MattJones/>    | "Matt Jones" 






RDQL - zapytanie ze złączeniem

Zapytanie:
SELECT ?givenName
WHERE (?y, <http://www.w3.org/2001/vcard-rdf/3.0#Family>, "Smith") ,
      (?y, <http://www.w3.org/2001/vcard-rdf/3.0#Given>, ?givenName)
Wynik:
givenName
=========
"John"   
"Rebecca"
Zapytanie:
SELECT ?resource, ?givenName
WHERE (?resource, <http://www.w3.org/2001/vcard-rdf/3.0#N>, ?z) ,
      (?z, <http://www.w3.org/2001/vcard-rdf/3.0#Given>, ?givenName)
Wynik:
resource                         | givenName
============================================
<http://somewhere/JohnSmith/>    | "John"   
<http://somewhere/RebeccaSmith/> | "Rebecca"
<http://somewhere/SarahJones/>   | "Sarah"  
<http://somewhere/MattJones/>    | "Matthew"






Co jest, a czego nie ma w RDQLu?







RDF i Prolog






Karol Bieńkowski