RDF icon

Informationsmodellering, RDF och den semantiska webbben

Staffan Malmgren, UppLYSning, 2008-09-30

staffan@tomtebo.org
http://blog.tomtebo.org/wp-content/2008/09/presentation.html

Bakgrund

Utgångspunkt: Kent frågade om det fanns något kul med lagen.nu att göra en upplysning om. Lagen.nu är en webbtjänst som innehåller alla sveriges lagar och rättsfall. Informationen hämtas i form av rådata från olika källor, och översätts till strukturerad form.

Strukturen på en lagtext

En lag är ofta uppdelad i kapitel. Varje kapitel har en eller flera paragrafer, och dessutom även rubriker och underrubriker. Varje paragraf har ett eller flera stycken, och ett stycke kan ha en punktlista. Det finns även tabeller, men det är oklart om de hör till närmast föregående stycke eller står för sig själv. Punktlistor kan nästlas, och det finnns även bokstavslistor och strecksatslistor.

Från rådata till struktur

Såhär ser materialet ut i den plaintextform jag har att utgå från. Vad som är en rubrik, en paragraf, ett stycke eller en punktlista framgår bara implicit från textformatteringen, som inte erbjuder mycket vägledning.

Från rådata till struktur

PDF-exempel

Samma material (nästan) finns även i PDF-format. Här framgår tydligare vad som är en rubrik och vad som är ett vanligt stycke, men fortfarande bara implicit, i form av fetstil med flera formatteringskonventioner.

Från rådata till struktur

I slutresultatet har strukturen gjorts explicit.

Hur funkar det här?

Frågor?

Informationsmodellering

Informationsmodellering handlar om hur man strukturerar upp information på bästa sätt. De flesta som håller på med datorer håller på med informationsmodellering på ett eller annat sätt.

Att bestämma hur filer döps, och vilket format dess innehåll är. Att designa ett nytt filformat.

Informationsmodellering

Att designa databasschemat. Vilka tabeller ska finnas, vilka fält och datatyper ska de ha, vilka primary och foreign keys ska finnas, vilka constraints ska finnas, osv. Normaliseringsformer.

Ett databasschema *är* inte ett filformat, utan en informationsmodell som kan *uttryckas* i exempelvis SQL-kommandon (CREATE TABLE).

Informationsmodellering

Att designa vilka element och attribut som ska finnas, och vad man får ha i dem. Kan göras informellt eller formellt - XML gör skillnad på well-formed och valid. Finns flera metoder för att formellt definera ett schema (DTD, XML Schema, RelaxNG). Namespaces gör det möjligt att blanda xml-scheman i ett dokument. (Exempel RSS 2.0?).

Ett XML-format *är* inte ett filformat, utan en informationsmodell som kan uttryckas i exempelvis XML-taggar.

Informationsmodellering

RDF är en teknik som låter dig modellera påståenden om resurser. Dessa påståenden bildar en graf.

RDF-modellen

Ett subjekt är det man gör påståendet om, exempelvis ett dokument, en person eller en plats.

Predikatet är typen av påstående, exempelvis att något har ett namn, eller att något innehåller en hänvisning.

Objektet är värdet för påståendet, exempelvis "Staffan Malmgren" (strängliteral) eller <http://www.ida.liu.se/location?room=B227214A>; (URI)

RDF-grafer

Allt är URI:er

http://tomtebo.org/about#me

http://purl.org/dc/terms/title

http://rinfo.lagrummet.se/publ/sfs/1960:729#P2

Alla predikat och nästan alla subjekt och objekt i en RDF-graf är URI:er. Det gör det möjligt att veta att man pratar om samma saker.

Samlingar av predikat

  • Vokabulär
  • Taxonomi
  • Ontologi

Formella beskrivningar i RDF Schema (rdfs) eller Web Ontology Language (owl)

  • En (kontrollerad) vokabulär är en uppsättning namn för saker.
  • En taxonomi är en vokabulär som är ordnad, med sub- och superklasser
  • En ontologi är en vokabulär som är uttryckt i ett formellt språk

Några vanliga vokabulärer

  • RDF
  • RDFS - för att uttrycka RDF-taxonomier
  • Dublin Core - metadata om dokument
  • FOAF - metadata om människor
  • Creative Commons - om upphovsrättighetsinformation
  • vCard / iCalendar - befintliga modeller, omformulerade i RDF
  • m.fl.

Att uttrycka RDF

En modell, många syntaxer

  • RDF/XML
  • N-triples
  • Turtle
  • RDFa

RDF/XML

"Staffan Malmgren håller en UppLYSning i Visionen om hur han använt RDF i projektet lagen.nu"

<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xmlns:foaf='http://xmlns.com/foaf/0.1/'
  xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
  xmlns:irl='http://example.org/irl#'
  xmlns:geonames='http://www.geonames.org/ontology#'
>
  <rdf:Description rdf:about="http://tomtebo.org/about#me">
    <foaf:currentProject rdf:resource="https://lagen.nu/"/>
    <irl:befinnerSigI>
      <rdf:Description rdf:about="http://www.ida.liu.se/location?room=B227214A">
        <geonames:name xml:lang="sv">Visionen</geonames:name>
      </rdf:Description>
    </irl:befinnerSigI>
    <foaf:name xml:lang="sv">Staffan Malmgren</foaf:name>
  </rdf:Description>
</rdf:RDF>
        

N-Triples

"Staffan Malmgren håller en UppLYSning i Visionen om hur han använt RDF i projektet lagen.nu"

<http://www.ida.liu.se/location?room=B227214A> <http://www.geonames.org/ontology#name> "Visionen"@sv.
<http://tomtebo.org/about#me> <http://example.org/irl#befinnerSigI> <http://www.ida.liu.se/location?room=B227214A>.
<http://tomtebo.org/about#me> <http://xmlns.com/foaf/0.1/name> "Staffan Malmgren"@sv.
<http://tomtebo.org/about#me> <http://xmlns.com/foaf/0.1/currentProject> <https://lagen.nu>

Turtle

"Staffan Malmgren håller en UppLYSning i Visionen om hur han använt RDF i projektet lagen.nu"

@prefix foaf: http://xmlns.com/foaf/0.1/.
@prefix geonames: http://www.geonames.org/ontology#.
@prefix irl: http://example.org/irl#.
@prefix rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#.
@prefix rdfs: http://www.w3.org/2000/01/rdf-schema#.
@prefix xml: http://www.w3.org/XML/1998/namespace.

 <http://tomtebo.org/about#me> irl:befinnerSigI <http://www.ida.liu.se/location?room=B227214A>;
     foaf:currentProject <https://lagen.nu/>;
     foaf:name "Staffan Malmgren"@sv.

 <http://www.ida.liu.se/location?room=B227214A> geonames:name "Visionen"@sv.
        

RDFa

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Hello XHTML</title>
  </head>
  <body>
    <p> 
      Staffan Malmgren
      <a href="http://www.ida.liu.se/location?room=B227214A">håller en UppLYSning i Visionen</a>
      om hur han använt RDF i projektet
      <a href="https://lagen.nu">lagen.nu</a>.
    </p>
  </body>
</html>
	
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:foaf="http://xmlns.com/foaf/0.1/"
      xmlns:geonames="http://www.geonames.org/ontology#"
      xmlns:irl="http://example.org/irl#"
      >
  <head>
    <title>Hello XHTML+RDFa</title>
  </head>
  <body>
    <p about="http://tomtebo.org/about#me" xml:lang="sv"> 
      <span property="foaf:name">Staffan Malmgren</span>
      <a href="http://www.ida.liu.se/location?room=B227214A"
	 rel="irl:befinnerSigI">håller en UppLYSning i 
      <def about="http://www.ida.liu.se/location?room=B227214A" property="geonames:name">Visionen</def></a>
      om hur han använt RDF i projektet
      <a href="https://lagen.nu" rel="foaf:currentProject">lagen.nu</a>.
    </p>
  </body>
</html>
	

Semantic web-stacken

Illustration från http://obitko.com/tutorials/ontologies-semantic-web/semantic-web-architecture.html

Programmera RDF: Python

from rdflib.Graph import Graph
from rdflib import URIRef, Literal, BNode, Namespace
from rdflib import RDF

store = Graph()

# Bind a few prefix, namespace pairs.
store.bind("dc", "http://http://purl.org/dc/elements/1.1/")
store.bind("foaf", "http://xmlns.com/foaf/0.1/")

# Create a namespace object for the Friend of a friend namespace.
FOAF = Namespace("http://xmlns.com/foaf/0.1/")

# Create an identifier to use as the subject for Donna.
donna = BNode()

# Add triples using store's add method.
store.add((donna, RDF.type, FOAF["Person"]))
store.add((donna, FOAF["nick"], Literal("donna", lang="foo")))
store.add((donna, FOAF["name"], Literal("Donna Fales")))
	

Programmera RDF: Java

package jena.examples.rdf ;

import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.vocabulary.*;

public class Tutorial01 extends Object {
    // some definitions
    static String personURI    = "http://somewhere/JohnSmith";
    static String fullName     = "John Smith";

    public static void main (String args[]) {
      // create an empty model
      Model model = ModelFactory.createDefaultModel();
      // create the resource
      Resource johnSmith = model.createResource(personURI);
      // add the property
      johnSmith.addProperty(VCARD.FN, fullName);
   }
}	  
	

Att lagra RDF: Triple stores

  • Sesame
  • Virtuoso
  • AllegroGraph

Att söka i RDF: SPARQL

PREFIX abc: <http://example.com/exampleOntology#> 
SELECT ?capital ?country
WHERE {
  ?x abc:cityname ?capital ;
     abc:isCapitalOf ?y .
  ?y abc:countryname ?country ;
     abc:isInContinent abc:Africa .
}
	  
	

Demo time

Om RDF i lagen.nu

Hjälp till!

  • BSD-licens
  • Subversion: http://svn.lagen.nu/svnroot/trunk/
  • Utvecklingswiki: http://trac.lagen.nu/
  • Mailinglista: http://groups.google.com/group/lagennu-utveckling