<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Staffan Malmgrens blogg &#187; metadata</title>
	<atom:link href="http://blog.tomtebo.org/tag/metadata/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tomtebo.org</link>
	<description>Programmering, juridik, punkrock och andra trivialiteter</description>
	<lastBuildDate>Sun, 01 Jan 2012 14:51:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>En arkitektur för webutveckling med semantic web-koncept</title>
		<link>http://blog.tomtebo.org/2009/06/30/en-arkitektur-for-webutveckling-med-semantic-web-koncept/</link>
		<comments>http://blog.tomtebo.org/2009/06/30/en-arkitektur-for-webutveckling-med-semantic-web-koncept/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 22:47:46 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[lagen.nu]]></category>
		<category><![CDATA[metadata]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[semantic web]]></category>
		<category><![CDATA[sparql]]></category>
		<category><![CDATA[webutveckling]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=681</guid>
		<description><![CDATA[Idag checkade jag in en ganska stor ändring i kodbasen för lagen.nu. Det är lite vanskligt att göra stora ändringar nu såhär en vecka innan lagkommenteringsprojektet drar igång på allvar, men just den här ändringen bör kunna göra det enklare &#8230; <a href="http://blog.tomtebo.org/2009/06/30/en-arkitektur-for-webutveckling-med-semantic-web-koncept/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Idag checkade jag in <a href="http://trac.lagen.nu/changeset/285">en ganska stor ändring</a> i<br />
kodbasen för lagen.nu. Det är lite vanskligt att göra stora ändringar<br />
nu såhär en vecka innan <a href="http://wiki.lagen.nu/">lagkommenteringsprojektet</a> drar igång<br />
på allvar, men just den här ändringen bör kunna göra det enklare att<br />
pussla ihop ny funktionalitet jämfört med hur det ser ut idag.</p>
<p>Vad ändringen handlar om är att använda RDF på en djupare nivå än<br />
vad som gjorts hittils, och med verktyg som är bättre lämpade. Det jag<br />
har nu börjar kännas nära en arkitektur för att bygga<br />
webbtillämpningar på semantic web-koncept istället för den traditionella kombon <a href="http://foldoc.org/rdbms">RDBMS</a> + SQL + dynamiskt språk<br />
(eller den något mindre traditionella dynamiskt språk + MVC-ramverk + <a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx">O/R-mappning</a>). </p>
<p>För att man ska förstå poängen börjar jag med att beskriva hur det har<br />
sett ut tidigare.</p>
<p>Innehållet på lagen.nu <a href="http://trac.lagen.nu/wiki/KodArkitektur">skapas i huvudsak i fyra<br />
steg</a>: Download, Parse, Relate och Generate. De två första stegen handlar<br />
om att hämta innehåll (lagtexter och rättsfall) från andra ställen,<br />
respektive att semantiskt strukturera upp detta (från de text- och<br />
wordfiler som laddats ner). Dessa berörs inte alls av ändringen.</p>
<p>Relate-steget är ganska enkelt: Det går igenom de strukturerade<br />
XHTML2/<a href="http://www.w3.org/TR/xhtml-rdfa-primer/">RDFa</a>-filer som<br />
skapats och plockar ut alla RDF-triples. Dvs från filer som innehåller<br />
både data (lagtext, domslutstext) och metadata (SFS-nummer, titlar,<br />
lagrumshänvisningar&#8230;) så plockas metadatat fram. Detta lagras sedan<br />
separat på lämpligt sätt.</p>
<p>Generate-steget tar sedan en strukturerad XHTML2-fil, exempelvis en<br />
lagtext och transformerar den till XHTML 1.0, färdigt att visas i en<br />
webbläsare. Denna transformering lägger till en massa information,<br />
exempelvis sidhuvud och sidfot, innehållsförteckning, och listor av<br />
relevanta rättsfall under varje paragraf.</p>
<p>För att göra det sista måste transformeringssteget på något vis ha<br />
tillgång till en lista över de relevanta rättsfallen. Tidigare har<br />
detta skett genom att Relate-steget konstruerat en (1) gigantisk<br />
RDF/XML-fil med information om samtliga 10 000+ rättsfall som finns i<br />
systemet, och XSLT-transformationen sedan laddat in denna med ett <a href="http://www.xml.com/pub/a/2002/03/06/xslt.html"><code>document()</code>-anrop</a>. Det<br />
funkar, men är både långsamt och oflexibelt.</p>
<p>Att skapa kopplingar mellan dokument genom systemets samlade metadata<br />
skulle kunna användas på rätt många olika sätt, men idag görs det bara<br />
på två sätt &#8212; dels för listorna på relevanta rättsfall under<br />
lagtextparagraferna, dels för att se till att bara de rättsfall som<br />
faktiskt finns i systemet är länkade i den lista över föregående<br />
rättsfall som finns bredvid varje rättsfall.  Det beror dels på att<br />
det är bökigt att implementera nya kopplingar, dels på att det just nu<br />
inte finns så mycket mer information i systemet än just lagtext och<br />
(svenska) rättsfall.</p>
<p>Men med lagkommenteringsprojektet börjar det senare<br />
ändras. Kommentaren för varje enskild paragraf lagras som ett<br />
RDF-påstående, på formen:</p>
<pre>&lt;http://rinfo.lagrummet.se/publ/sfs/1998:204#P13&gt; dct:description
"Huvudregeln för känsliga uppgifter är ..."</pre>
<p>Och även andra informationskällor ska in. Jag har fyra moduler i<br />
varierande stadier av halvfärdighet (för <a href="http://trac.lagen.nu/browser/trunk/RegPubl.py">propositioner och<br />
utredningsbetänkanden</a>, <a href="http://trac.lagen.nu/browser/trunk/ARN.py">Allmäna<br />
reklamationsnämnens praxis</a>, <a href="http://trac.lagen.nu/browser/trunk/JO.py">JO-beslut</a> och <a href="http://trac.lagen.nu/browser/trunk/Curia.py">EG-domstolens<br />
domslut</a>) och en på planeringensstadiet (EG-lagstiftning).</p>
<p>Med flera informationskällor växer möjligheten för användbara<br />
kopplingar exponentiellt. Under varje paragraf skulle man kunna lista<br />
namnen på den proposition som föranlett lagändringar i denna, eller<br />
namn på EG-direktiv som föranlett propositionerna. För varje sökord<br />
som rättsfall använder kan man skapa en sida som listar andra<br />
rättsfall med samma sökord. Och sen plocka in information från <a href="http://www.rikstermbanken.se/">rikstermbanken</a>, <a href="http://sv.wikipedia.org/">svenska Wikipedia</a> och förstås <a href="http://wiki.lagen.nu/">vår egen wiki</a>.</p>
<p>Om man kan skapa en koppling mellan EG-direktiv och svensk lag (på<br />
paragraf/artikelnivå) skulle man tillochmed skapa en koppling mellan<br />
svenska lagparagrafer och förhandsavgöranden från EG-domstolen för<br />
andra länder. Om ni bara kunde se in i huvudet på mig skulle ni<br />
förstå hur vackert allt kommer att bli.</p>
<p>Men systemet med att spara ner allt i gigantiska XML-blobbar och gräva<br />
igenom dessa med XSLT-funktionen <code>document()</code> skalar inte.</p>
<p>Så, vad dagens ändring gör är att byta ut metadatalagringen &#8211; från<br />
stora statiska filer till en <a href="http://www.openrdf.org/">RDF-databas</a>. Jag vet att det <a href="http://blog.tomtebo.org/2005/08/31/allt-du-lart-dig-om-webutveckling-ar-fel/">strider<br />
mot mina tidigare principer</a>, men med strax över en miljon poster<br />
(triples) har jag <a href="http://blog.tomtebo.org/2009/01/26/mediawiki-som-datalager/">insett</a><br />
att det faktiskt behövs.</p>
<p>Enligt den nya ordningen så stoppar Relate-steget in all metadata i<br />
Sesame-databasen istället för att stoppa in det i en gigantisk fil. I<br />
Generate-steget körs sedan ett antal <a href="http://www.w3.org/2009/sparql/wiki/Main_Page">SPARQL-frågor</a> mot denna databas,<br />
och sparar ner steget i en temporär XML-fil, som bara innehåller den<br />
information som är relevant för just det dokument som ska skapas. Den<br />
läses sen in med <code>document()</code> precis som tidigare. Skillnaden är att<br />
denna temporärfil är liten och därmed snabbprocessad, samt att<br />
utvecklingen för att stoppa ner nya datamängder i den är liten &#8211; dels<br />
en SPARQL-fråga, dels lite klisterkod för att mappa svaret till en<br />
XML-ig trädstruktur. Vad det gäller det senare hoppas jag kunna<br />
använda <a href="http://code.google.com/p/oort/wiki/SparqlTree">SPARQLTree</a><br />
för att kunna generalisera det helt.</p>
<p>Vad det gäller det förra så är det dock inte hel-enkelt att skriva bra<br />
SPARQL-frågor. Den enda hjälpen som är något att ha är själva specen,<br />
och den innehåller liksom inte så mycket tips av &#8221;for<br />
dummies&#8221;-karaktär. Det leder till att mina frågor är ganska yxiga än<br />
så länge. Förhoppningsvis inser jag hur de kan förenklas allt eftersom<br />
jag lär mig krypa på det här området.</p>
<p>Som ett exempel på svårigheterna kan nämnas hur man ska formulera en<br />
fråga som hämtar information alla rättsfall som hänvisar till en viss<br />
lag. Informationen om ett visst rättsfall lagras enligt följande mall<br />
(<a href="http://www.w3.org/DesignIssues/Notation3">N3-notation</a>):</p>
<pre>
@prefix dct: &lt;http://purl.org/dc/terms/&gt; .
@prefix rinfo: &lt;http://rinfo.lagrummet.se/taxo/2007/09/rinfo/pub#&gt; .

&lt;http://rinfo.lagrummet.se/publ/rattsfall/rh/2003:65&gt; a rinfo:Rattsfallsreferat ;
     dct:creator &lt;http://lagen.nu/org/2008/hovratten-for-nedre-norrland&gt; ;
     dct:description "En kvinna med en insulinberoende diabetes, åtalad för misshandel[...]"@sv ;
     dct:identifier "RH 2003:65"@sv ;
     dct:relation ""@sv ;
     dct:subject "Uppsåt"@sv ;
     rinfo:avgorandedatum "2003-11-21"@sv ;
     <b>rinfo:lagrum &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2S2&gt; </b>
     rinfo:malnummer "B24-03"@sv .
</pre>
<p>Det intressanta här är <code>rinfo:lagrum</code>-triplen (i fetstil). Det är fråga<br />
om ett rättsfall som hänvisar till brottsbalken, närmare bestämt 1<br />
kap. 2 § 2 st. Brottsbalken har i det här systemet URI:n<br />
<code>&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt;</code>.</p>
<p>En inititial SPARQL-fråga för att hämta information om alla rättsfall som hänvisar<br />
till brottsbalken kan se ut såhär:</p>
<pre>
PREFIX dct:&lt;http://purl.org/dc/terms/&gt;
PREFIX rinfo:&lt;http://rinfo.lagrummet.se/taxo/2007/09/rinfo/pub#&gt;

SELECT ?uri ?id ?desc
WHERE {
    ?uri rinfo:lagrum &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
    ?uri dct:identifier ?id .
    ?uri dct:description ?desc
}
</pre>
<p>(Not: om du inte redan kan grundläggande SPARQL rekommenderar jag att<br />
exempelvis läsa <a href="http://en.wikipedia.org/wiki/SPARQL">wikipediasidans<br />
introduktion</a>).</p>
<p>Problemet är att den frågan enbart kommer att hitta rättsfall som<br />
hänvisar till brottsbalken i sin helhet, inte rättsfall som hänvisar<br />
till någon enskild paragraf. Detta eftersom URI:er i RDF är<br />
ogenomskinliga &#8212; det finns inget inherent samband mellan<br />
<code>&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt;</code> och<br />
<code>&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2S2&gt;</code> (som<br />
är URI:n för 1 kap. 2 § 2 st. Brottsbalken).</p>
<p>Det vi vill göra är att ställa en fråga som matchar alla rättsfall som<br />
hänvisar till en viss lag eller något som är en del av samma lag<br />
(enskilda kapitel, paragrafer eller stycken). Ett enkelt, fult,<br />
långsamt och fel sätt är att göra det med ett filter:</p>
<pre>
PREFIX dct:&lt;http://purl.org/dc/terms/&gt;
PREFIX rinfo:&lt;http://rinfo.lagrummet.se/taxo/2007/09/rinfo/pub#&gt;

SELECT ?uri ?id ?desc ?lagrum
WHERE {
    ?uri dct:identifier ?id .
    ?uri dct:description ?desc .
    ?uri rinfo:lagrum ?lagrum .
    FILTER regex(str(?lagrum), "http://rinfo.lagrummet.se/publ/sfs/1962:700")
}
</pre>
<p>Ganska enkelt, men i praktiken väldigt långsamt, gissningsvis för att<br />
SPARQL-motorn är tvungen att konvertera varenda URI (en datatyp) till<br />
en sträng (en helt annan datatyp), för att sen se om den möjligtvis<br />
börjar på ett visst sätt. Det är också fel, eftersom frågan gör ett<br />
antagande om att<br />
<code>&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2S2&gt;</code><br />
är en resurs som är en del av resursen<br />
<code>&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt;</code>, utan<br />
någon täckning för det antagandet.</p>
<p>Det korrekta sättet är att modellera just detta<br />
&#8221;är-del-av&#8221;-förhållande. I RDF-databasen finns en mängd triples av<br />
följande typ:</p>
<pre>
&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2S2&gt; a rinfo:Stycke;
     dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2&gt;.

&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2&gt; a rinfo:Paragraf;
     dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1&gt;.

&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1&gt; a rinfo:Kapitel;
     dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt;.
</pre>
<p>Med det kan vi formulera en fråga som ger oss information om alla<br />
rättsfall för en viss lagtext. Vi vill ha alla rättsfall som antingen<br />
har en <code>rinfo:lagrum</code>-relation med lagtextens URI<br />
<i>eller</i> en <code>rinfo:lagrum</code>-relation med en URI som har<br />
en <code>dct:isPartOf</code>-relation med lagtextens URI <i>eller</i><br />
en <code>rinfo:lagrum</code>-relation med en URI som har en<br />
<code>dct:isPartOf</code>-relation med en URI som har en<br />
<code>dct:isPartOf</code>-relation med lagtextens URI<br />
<i>eller&#8230;</i></p>
<p>Ok, det blir inte så vackert det här heller, men det blir rätt och<br />
snabbt. Den SPARQL-fråga jag har just nu blir såhär:</p>
<pre>
PREFIX dct:&lt;http://purl.org/dc/terms/&gt;
PREFIX rinfo:&lt;http://rinfo.lagrummet.se/taxo/2007/09/rinfo/pub#&gt;

SELECT ?uri ?id ?desc ?lagrum
WHERE {
   { ?uri rinfo:lagrum &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
     ?uri dct:identifier ?id .
     ?uri dct:description ?desc }
   UNION { ?uri rinfo:lagrum ?lagrum .
           ?lagrum dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
           ?uri dct:identifier ?id .
           ?uri dct:description ?desc }
   UNION { ?uri rinfo:lagrum ?lagrum .
           ?lagrum dct:isPartOf ?b .
           ?b dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
           ?uri dct:identifier ?id .
           ?uri dct:description ?desc }
   UNION { ?uri rinfo:lagrum ?lagrum .
           ?lagrum dct:isPartOf ?b .
           ?b dct:isPartOf ?c .
           ?c dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
           ?uri dct:identifier ?id .
           ?uri dct:description ?desc }
   UNION { ?uri rinfo:lagrum ?lagrum .
           ?lagrum dct:isPartOf ?b .
           ?b dct:isPartOf ?c .
           ?c dct:isPartOf ?d .
           ?d dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
           ?uri dct:identifier ?id .
           ?uri dct:description ?desc }
   UNION { ?uri rinfo:lagrum ?lagrum .
           ?lagrum dct:isPartOf ?b .
           ?b dct:isPartOf ?c .
           ?c dct:isPartOf ?d .
           ?d dct:isPartOf ?e .
           ?e dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
           ?uri dct:identifier ?id .
           ?uri dct:description ?desc }
}
</pre>
<p>Förslag på hur man kan förenkla det hela mottages tacksamt&#8230;</p>
<p>Det framgår kanske att det här inte är en arkitektur för alla<br />
problem. Men om man har data som kan modelleras med RDF (och när man<br />
jobbat med RDF ett tag så tycker man att i stort sett allt gör det) så<br />
tror jag att åtminstone kombinationen triplestore + SPARQL kan vara<br />
ett intressant alternativ till RDBMS + SQL.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2009/06/30/en-arkitektur-for-webutveckling-med-semantic-web-koncept/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>teddybjörnsdebuggning del 2</title>
		<link>http://blog.tomtebo.org/2006/07/18/teddybjornsdebuggning-del-2/</link>
		<comments>http://blog.tomtebo.org/2006/07/18/teddybjornsdebuggning-del-2/#comments</comments>
		<pubDate>Tue, 18 Jul 2006 10:47:24 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[lagen.nu]]></category>
		<category><![CDATA[metadata]]></category>
		<category><![CDATA[rättsinformation]]></category>
		<category><![CDATA[systemarkitektur]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/lagen_nu/teddybjornsdebuggning-del-2.html</guid>
		<description><![CDATA[Det där med teddybjörnsdebuggning funkade ganska bra. Jag fortsätter med nästa designfråga. Eftersom det här i första hand är anteckningar för mig själv är jag inte alltid övertydlig med förklaringar, men fråga gärna om du undrar något! Frågan att lösa &#8230; <a href="http://blog.tomtebo.org/2006/07/18/teddybjornsdebuggning-del-2/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Det där med <a href="http://blog.tomtebo.org/programming/teddybjornsdebuggning.html">teddybjörnsdebuggning</a> funkade ganska bra. Jag fortsätter med nästa designfråga. Eftersom det här i första hand är anteckningar för mig själv är jag inte alltid övertydlig med förklaringar, men fråga gärna om du undrar något!</p>
<p>Frågan att lösa är hanteringen av rättskälledokument som vi inte har tillgång till (placeholders). Ett typiskt exempel är NJA 1977 s. 756 (det s.k. lingonpulpfallet, som utvecklar principer om bevisbördans placering för leveransköp där köparen står risken under transport). Detta finns inte hos domstolsverket, men det vore bra att ha med i databasen, åtminstone ett metadataskelett bestående av titel och NJA-nummer (och kanske referade rättsfall/lagrum etc), så att andra rättsfall, diskussioner, litteraturhänvisningar etc kan länka till det.</p>
<p>
För rättsfall (om vi börjar med det) som vi <b>har</b> tillgång till ser arbetsgången ut såhär:
</p>
<ul>
<li>Rättsfallet laddas ned (<tt>Download</tt>)</li>
<li>XML utvinns ur HTML-koden (<tt>Parse</tt>)</li>
<li>Rättsfallet indexeras i databasen (<tt>Index</tt>), detta steg innebär att en rad i LegalDocument-tabellen skapas med URN[1], displayid, xmlpath och htmlpath</li>
<li>HTML genereras från XML och ett rättskällespecifikt XSLT-stylesheet (<tt>Generate</tt>)</li>
</ul>
<p>När allt detta är på plats kan vi visa rättsfallet. All central metadata (målnummer/referatnummer, rubrik, lagrum etc) ligger i XML-filen.</p>
<p>Jag ser två skilda tillvägagångssätt: Antingen låter vi våra placeholders efterlikna de vanliga rättskälledokumenten så mycket som möjligt, med målet att senare delar i kedjan (de som katalogiserar, visar och gör dokument kommenterbara) inte ska behöva veta om det är en placeholder eller inte. </p>
<p> Eller så låter vi placeholders vara väsensskilda from vanliga rättskälledokument, just för att göra det tydligt att det här inte är originalinformation (vad är exempelvis skillnaden mellan inbyggd och tillförd metadata för en placeholder?)
</p>
<p>Förslag (som mest går på den första vägen): LegalDocument-tabellen utökas med en isPlaceholder-boolean, eller kanske en source-URL (skulle då vara http://www.rattsinfosok.dom.se/-nånting för originaldokument och http://lagen.nu/nånting för placeholders).
</p>
<p>Wikin utökas med en möjlighet att mata in skelettet till ett rättskälledokument (i första steget XML-rakt-upp-och-ned, i andra steget med hjälpsam formulärfrontend). Vi skulle kunna använda Mediawiki-style-namespaces: default namespace för vanliga artiklar, ett annat för kommentarer/annoteringar (&#8221;Annotering:1960:729&#8243;, ett tredje för placeholders (&#8221;Källdokument:NJA_1977_s._756&#8243;) osv. För just placeholder-namespacet gör wikins save-funktion motsvarande <tt>Index</tt> och <tt>Generate</tt> (se ovan).</p>
<p>Den stora fördelen är att wikiinfrastrukturen för användarhantering och historyhantering kan återanvändas (och jag gillar idén med att wikienabla så mycket som möjligt av det användargenererade innehållet). Även framtida wikiidéer, som att använda trust metrics, skulle då komma placeholderhanteringen till godo.</p>
<p>[1] URN ger ett speciellt problem just för rättsfall. Som jag sade tididgare är det att föredra att använda målnummer framför sidnummer i NJA när URN:en konstrueras, men för gamla rättsfall har vi inte alltid tillgång till denna. Då blir vi så illa tvugna att utgå från (säg) NJA-sidnumret (urn:x-nja:1977#s756). Det kan leda till en situation där vi för ett visst fall har både en placeholder och ett &#8221;riktigt&#8221; rättskälledokument i databasen, men med olika URNs. Det är inte så mycket att göra åt (men man kan naturligtvis skriva ett script som letar efter och upptäcker sådant)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2006/07/18/teddybjornsdebuggning-del-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Teddybjörnsdebuggning</title>
		<link>http://blog.tomtebo.org/2006/07/15/teddybjornsdebuggning/</link>
		<comments>http://blog.tomtebo.org/2006/07/15/teddybjornsdebuggning/#comments</comments>
		<pubDate>Fri, 14 Jul 2006 23:19:57 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[lagen.nu]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[metadata]]></category>
		<category><![CDATA[rättsinformation]]></category>
		<category><![CDATA[RDF]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/programming/teddybjornsdebuggning.html</guid>
		<description><![CDATA[Jag funderar på hur jag borde strukturera upp datamodellen för lagen.nu med avseende på användargenererat innehåll. Ett bra sätt att lösa programmering är sk teddybjörnsdebuggning, även känt som Rubber Ducking eller att använda en Cardboard Programmer. Idéen är alltså att &#8230; <a href="http://blog.tomtebo.org/2006/07/15/teddybjornsdebuggning/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Jag funderar på hur jag borde strukturera upp datamodellen för lagen.nu med avseende på användargenererat innehåll. Ett bra sätt att lösa programmering är sk teddybjörnsdebuggning, även känt som <a href="http://www.c2.com/cgi/wiki?RubberDucking">Rubber Ducking</a> eller att använda en <a href="http://www.c2.com/cgi/wiki?CardboardProgrammer">Cardboard Programmer</a>. Idéen är alltså att förklara sitt problem för något föremål som representerar en åhörare; genom att man tvingar sig att formulera problemet på ett sådant sätt att det blir begripligt för denna tänkta åhörare reder man ofta ut det och hittar lösningen av sig själv. Genom att använda en teddybjörn, anka eller liknande slipper man störa någon annan. Och eftersom ingen ändå läser den här bloggen <img src='http://blog.tomtebo.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  får den agera teddybjörn idag.
</p>
<p>
Det jag vill uppnå är att man ska kunna koppla metadata till godtyckliga rättskällor, på ett sådant sätt att det blir lätt att sammankoppla liknande källor. För teknikerna i publiken kanske det är värt att beskriva vad en rättskälla är; det är något som innehåller rättsregler och alltså kan användas som bas för ett juridiskt resonemang. Den typiska rättskällan är lagtext, men även förarbeten, domslut, juridisk litteratur och oskrivna rättsgrundsatser kan räknas som rättskällor. Avgränsning mellan rättskällor är inte alltid helt knivskarp; exempelvis kan man fråga sig om lagar (bestäms av riksdagen), förordningar (bestäms av regeringen enligt delegeringsregler från av riksdagen) och föreskrifter (bestäms av myndigheter enligt delegeringsregler från regeringen) är en och samma rättskälla eller tre olika.
</p>
<p>
Det är heller inte helt klart vad den minsta odelbara enheten i en rättskälla är; är det enskilda lagar som sådana, enskilda paragrafer, stycken, meningar, punkter eller ord?
</p>
<p>
Med detta sagt, vad vill jag uppnå med att &#8221;koppla metadata till godtyckliga rättskällor&#8221;? Jag vill förbättra sök- och sammankopplingsmöjligheterna. Ett exempel: NJA 1994 s 74 kallas allmänt <em>&#8221;smultronfallet&#8221;</em> bland jurister. Det behandlar frågor om <em>verkshöjd</em> för brukskonst, det s.k.  <em>dubbelskapandekriteriet</em> och utvecklar en bevisbörderegel för att avgöra om intrång i upphovsrätt enligt <em>2 § URL</em> har skett, som sedermera blivit känt som <em>hoppande bevisbörda</em>. Det ingår i <em>kursfordran i C3</em>:an på Stockholms universitet, kommenteras av Karnell i i <a href="http://www.nir.nu/artiklar.asp?id=46"><em>NIR 1994 s 85</em></a> och omnämns av Olsson i <a href="http://www.nj.se/njab/produkt.nsf/lf1?ReadForm&#038;1E43BF0DC9E5C9A7412568A1004D5949?Open">Copyright, sjunde upplagan</a>, s 72 Vi har här åtminstone åtta olika metadata (metadatum?). Några av dem hör till rättsfallet, några kopplar ihop rättsfallet med andra rättskällor. Några av dem är uttryckta direkt i rättsfallet såsom det är publicerat hos domstolsverket (explicit metadata), några kan deduceras från andra rättskällor (implicit metadata) och en del känner jag bara till efter att ha gått C3an (extern metadata) (sade jag föressten att jag fick Ab även där? Fyra kurser i rad, yay me!). Det finns ytterligare metadata som en erfaren immaterialrättsjurist skulle kunna plocka fram.
</p>
<p>
Vad ska man kunna uppnå med all denna metadata? Några exempel: Jag vill att man ska kunna, på google suggest-maner, mata in &#8221;smultr&#8221; och få upp &#8221;smultronfallet (NJA 1994 s 74)&#8221; i förslagslistan. På wikisidan för Dubbelskapandekriteriet ska det finnas en automatisk länk till rättsfallet, och även under eller bredvid texten i 2 § URL. När man tittar på NJA 2002 s 178 (&#8221;melodimålet&#8221;, som använder sig samma intrångsbedömning) ska det finnas en länk till rättsfallet, med &#8221;(hoppande bevisbörda)&#8221; som kommentar. Och naturligtvis ska det finnas ett omnämnande av Karnell och Levins artiklar på sidan som beskriver rättsfallet.
</p>
<p>
Hur ska det här representeras? Och hur ska vi dra skillnaden mellan explicit, implicit och extern metadata?
</p>
<p>
Det hjälper att kunna adressera saker; kanske i en URN-baserad syntax. Något i stil med följande:
</p>
<ul>
<li><tt>urn:x-dv:hd:T1138-92</tt> motsvarar NJA 1994 s 74 (varför inte något i stil med urn:x-nja:1994#74? jo, även om alla jurister refererar till fallet genom dess sidnummer i det årets NJA-utgåva så är den bästa identifieraren för fallet faktiskt målnumret &#8212; dels för att den är officiell på ett sätt som den privat utgivna NJA inte är, dels för att den finns tillgänglig direkt &#8212; vilket sidnummer en dom hamnar på i NJA vet man inte förrän det årets utgåva är tryckt och klar)</li>
<li><tt>urn:x-dv:hd:T828-01</tt> motsvarar NJA 2002 s 178 på samma sätt.</li>
<li><tt>urn:x-sfs:1960:729#P2</tt> motsvarar 2 § upphovsrättslagen</li>
<li><tt>urn:x-su:jur:c3#kursfordran</tt> motsvarar kursfordran på c3:an</li>
<li><tt>urn:issn:0027-6723:1994#s85</tt> motsvarar Karnells artikel i NIR</li>
<li><tt>urn:isbn:91-39-01172-0#s72</tt> motsvarar Olssons omnämnande i Copyright.</li>
</ul>
<p>
Man kan observera att alla ovanstående uppgifter kan uttryckas på formen objekt &#8211; relation &#8211; subjekt &#8212; dvs den modell som används i RDF/semantic web. Vi kan uttrycka ovanstående metadata i N3-syntax. Några relationer tar vi från Dublin Core, andra hittar vi på själva.
</p>
<pre>
@prefix dct:  &lt;http ://purl.org/dc/terms/1.1/&gt;
urn:x-dv:hd:T1138-92 "behandlar" "verkshöjd"
urn:x-dv:hd:T1138-92 dct:references urn:x-sfs:1960:729#P2

urn:x-dv:hd:T828-01 dct:references urn:x-dv:hd:T1138-92

urn:x-dv:hd:T1138-92 dct:alternative "Smultronfallet"
urn:x-dv:hd:T1138-92 "behandlar" "dubbelskapandekriteriet"
urn:x-dv:hd:T1138-92 "utvecklar" "hoppande bevisbörda"
urn:x-dv:hd:T828-01 "behandlar" "hoppande bevisbörda"
urn:x-su:jur:c3#kursfordran dct:requires  urn:x-dv:hd:T1138-92
urn:issn:0027-6723:1994#s85 "kommenterar" urn:x-dv:hd:T1138-92
urn:isbn:91-39-01172-0#s72  "kommenterar" urn:x-dv:hd:T1138-92
</pre>
<p>
Listan över möjliga relationstyper måste förstås fastställas på något lämpligt sätt, ovanstående är bara ett snabbt utkast.
</p>
<p>
I ovanstående är de två första relationerna explicita; när man tittar på rättsfallsreferatet står det klart och tydligt &#8221;Lagrum: 2 § Upphovsrättslagen&#8221; och &#8221;Sökord: Verkshöjd&#8221;. Den tredje relationen är implicit &#8212; den framgår inte direkt av smultronfallet, men däremot från melodimålet (det är dock explicit metadata sett från melodimålets perspektiv). De avslutande relationerna är explicita &#8212; vi känner bara till dem om nån har manuellt matat in dem i systemet. Notera dock att om jag på något sätt skulle komma över en digitaliserad komplett lista över vilka rättsfall som behandlats i juridisk litteratur, och lagt in den som en (del av en) rättskälla, skulle de sista två (Karnells och Olssons kommentarer) övergå från extern till implicit metadata.
</p>
<p>
Egentligen kan man se det som en 2&#215;2 matris, där ett metadatum sorteras in olika beroende på dels om det är automatiskt utvunnet (&#8221;inbyggt metadata&#8221;) eller manuellt inmatat (&#8221;tillfört metadata&#8221;), dels om det har den aktuella rättskällan som objekt eller subjekt. Om man ser det på det här viset blir termerna explicit och implicit metadata lite meningslösa.
</p>
<table>
<tr>
<td></td>
<th>inbyggt</th>
<th>tillfört</th>
</tr>
<tr>
<th>subjekt</th>
<td>smultronfallet stödjer sig på 2 § URL</td>
<td>smultronfallet utvecklar &#8221;hoppande bevisbörda&#8221;</td>
</tr>
<tr>
<td><b>objekt</b></td>
<td>melodimålet refererar smultronfallet</td>
<td>NIR 1994 s 85 kommenterar smultronfallet</td>
</tr>
</table>
<p>
Det här skulle vara ganska enkelt att överföra till en datamodell. Men för att skilja på inbyggt och tillfört metadata  gör vi detta till två separata modeller (<a href="http://www.djangoproject.com/documentation/model_api/">djangosyntax</a>):
</p>
<pre>
class IntrinsicRelation(models.Model):
    object = Models.charFields(maxlength=100)
    relation = Models.charFields(maxlength=100)
    subject = Models.charFields(maxlength=100)

class AddedRelation(models.Model):
    object = Models.charFields(maxlength=100)
    relation = Models.charFields(maxlength=100)
    subject = Models.charFields(maxlength=100)
</pre>
<p>
IntrisicRelation-tabellen byggs om vid varje uppdatering, medans AddedRelation-tabellen editeras wiki-style. Den senare borde därför ha nån sorts history-funktionalitet. Jag tänker något i stil med bugzillas history, där man kan se vilka egenskaper (motsvarande våra relationer) som ändrats av vem och när. Kanske att det räcker med en loggtabell eller -fil?
</p>
<p>Tja, ungefär så. Ett närliggande problem som jag inte har löst än är hur vi ska hantera rättsfall för vilka domstolsverket (där jag hämtat data ifrån) inte har någon information &#8212; det gäller exv alla rättsfall innan 1980. Många av dessa är intressanta, och man kan tänka sig att personer för hand matar in åtminstone några centrala metadata som enligt ovanstående modell är inbyggt (referat-id, rubrik, lagrum) så att man sedan har något att hänga upp tillfört metadata på (nyckelord). Men det blir en fråga för nästa teddybjörnsdebuggningssession.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2006/07/15/teddybjornsdebuggning/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Målnummer, personuppgifter och journalistisk verksamhet</title>
		<link>http://blog.tomtebo.org/2005/10/24/malnummer-personuppgifter-och-journalistisk-verksamhet/</link>
		<comments>http://blog.tomtebo.org/2005/10/24/malnummer-personuppgifter-och-journalistisk-verksamhet/#comments</comments>
		<pubDate>Mon, 24 Oct 2005 21:59:36 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[law]]></category>
		<category><![CDATA[journalistiskt ändamål]]></category>
		<category><![CDATA[metadata]]></category>
		<category><![CDATA[personuppgifter]]></category>
		<category><![CDATA[PUL]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=273</guid>
		<description><![CDATA[I efterdyningarna från kontakten med domstolsverket började jag forska lite mer i juridiken kring det hela. Det blev frågor som rörde såväl FL som BrB, PUL och YGL. Det mynnade ut i ett PM som kanske dyker upp här snart. &#8230; <a href="http://blog.tomtebo.org/2005/10/24/malnummer-personuppgifter-och-journalistisk-verksamhet/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I efterdyningarna från <a href="http://blog.tomtebo.org/law/juridiska-vs-tekniska-losningar-pa-problem.html">kontakten med domstolsverket</a> började jag forska lite mer i juridiken kring det hela. Det blev frågor som rörde såväl <a href="http://lagen.nu/1986:223#P22" title="förvaltningsbesvär">FL</a> som <a href="http://lagen.nu/1962:700#K4P9c" title="dataintrång">BrB</a>, <a href="http://lagen.nu/1998:204#P21" title="personuppgifter om lagöverträdelser">PUL</a> och <a href="http://lagen.nu/1991:1469#K1P9" title="databasregeln">YGL</a>. Det mynnade ut i ett PM som kanske dyker upp här snart.</p>
<p>En av sakerna jag lärde mig handlar om personuppgifter: tidigare sa jag tvärsäkert att jag inte behandlade sådana på lagen.nu, eftersom de bara förekom i domslutsreferaten, och jag brydde mig ju bara om data man hittar i detaljvyn, som titel, lagrum, domstol, målnummer&#8230; målnummer? Låt oss se hur <a href="http://lagen.nu/1998:204#P3">definitionen på personuppgift</a> lyder:</p>
<dl>
<dt>Personuppgifter</dt>
<dd>All slags information som direkt eller indirekt kan hänföras till en fysisk                               person som är i livet.</dd>
</dl>
<p>Jepp. Ett målnummer passar jättebra in på den här definitionen, då den indirekt kan hänföras till parterna i ett civilmål, eller den tilltalade i ett brottmål. Jag kände mig hyfsat dum när det här påpekades för mig. Och på tal om brottmål blir det ännu bättre om vi kollar <a href="http://lagen.nu/1998:204#P21">21 §</a>:</p>
<blockquote><p>
Det är förbjudet för andra än myndigheter att behandla personuppgifter om lagöverträdelser som innefattar brott, domar i brottmål, straffprocessuella tvångsmedel eller administrativa frihetsberövanden.
</p></blockquote>
<p>Oops. Jag, som inte vill begå några brott mot PUL, tog raskt bort all rättsfallsinformation från lagen.nu medans jag utredde situationen.</p>
<p>Men, var det inte den här paragrafen som <a href="http://www.antipiratbyran.com/">APB</a> nyss <a href="http://www.datainspektionen.se/nyhetsarkiv/nyheter/2005/oktober/2005-10-13.shtml">fick dispens ifrån</a>? De kanske kan göra ett undantag för mig också, tänkte jag och ringde <a href="http://www.datainspektionen.se/kontakta_oss/kontakta_oss.shtml">datainspektionens callcenterjurister</a>. Efter att ha redogjort för min situation förklarade den vänliga juristen på andra sidan att min användning rymdes under rubriken &#8221;<a href="http://lagen.nu/1998:204#P7">journalistisk verksamhet</a>&#8221;. Jag tyckte det lät mycket konstigt, och underströk att jag inte gör något sorts redaktionellt urval eller överhuvudtaget nånting som liknar det som journalister håller på med, men tydligen ska uttrycket tolkas så pass extensivt.</p>
<p>Poängen med att behandlingen anses ske uteslutande för journalistiskt ändamål är att stora delar av PUL då inte blir tillgänglig, bland annat <a href="http://lagen.nu/1998:204#P10">10 §</a> och <a href="http://lagen.nu/1998:204#P10">21 §</a> &#8212; fantastiskt smidigt. Nästan som att skaffa ett utgivningsbevis för att falla under YGL, men utan alla nackdelar. Som jag ska skriva om i detalj nån annan gång.</p>
<p><strong>Uppdatering:</strong> Bara för att min användning tydligen faller under journalistisk verksamhet, är det inte säkert att din gör det. Det här är inte juridisk rådgivning. Om du är osäker, ring eller maila datainspektionen, de är pigga på att svara på frågor.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2005/10/24/malnummer-personuppgifter-och-journalistisk-verksamhet/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Back again!</title>
		<link>http://blog.tomtebo.org/2004/08/17/back_again/</link>
		<comments>http://blog.tomtebo.org/2004/08/17/back_again/#comments</comments>
		<pubDate>Tue, 17 Aug 2004 09:12:00 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[blosxom]]></category>
		<category><![CDATA[metablogging]]></category>
		<category><![CDATA[metadata]]></category>

		<guid isPermaLink="false">http://newblog.tomtebo.org/misc/back_again.html</guid>
		<description><![CDATA[After a two month hiatus from writing, and one month of actual downtime, this blog is back. The reasons for downtime are mainly various technical problems, most of them having to do with me wanting to host the blog on &#8230; <a href="http://blog.tomtebo.org/2004/08/17/back_again/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
After a two month hiatus from writing, and one month of actual<br />
downtime, this blog is back. The reasons for downtime are mainly<br />
various technical problems, most of them having to do with<br />
me wanting to host the blog on the big windows machine under my desk,<br />
instead of some decent hosting provider, and also a two-week holiday in<br />
Guatemala, during which I neither had the opportunity or felt the need<br />
to get the site running remotely.
</p>
<p>
As for the writing hiatus, that had to do with some fairly substantial<br />
changes that are going on in my life. At that time, it was to early to<br />
say anything in any place that google indexes, but now things can be<br />
told.
</p>
<p>
But that will be for a later post. Right now I want to divert your<br />
attention to the brand new, sleek, unmodified-right-out-of-the-box<br />
design of the blog (well, most of you probably read this in a RSS<br />
reader and those that don&#8217;t, should consider, but&#8230;). I&#8217;ve moved from<br />
<a href="http://dasblog.net/documentation/">dasBlog</a> on WinXP to <a href="http://www.blosxom.com/">Blosxom</a> on FreeBSD, mainly for the<br />
reason that my FreeBSD box has only had one hard drive crash in five<br />
years, while my Windows box has had two in just over six months. This<br />
also reduces the number of boxes that I have to have running<br />
permanently under my desk.
</p>
<p>
I could have tried to install <a href="http://www.go-mono.com/">Mono</a> on FreeBSD and kept on running<br />
dasBlog that way, but since this machine is a 166 Mhz Pentium I, it<br />
might not have proven to be such a snappy experience. Blosxom (which,<br />
by the way, should be spelled &#8216;bloxsom&#8217;, according to my fingers) can<br />
be configured to generate static pages, which is much more suitable<br />
for that kind of horsepower, and it&#8217;s also nicer from a security<br />
perspective.
</p>
<p>
The drawback is of course that I have to import all old entries (and<br />
comments) from the old blog somehow. Since all the stuff is there in<br />
good ol&#8217; XML, it should be no more trouble than a 15-minute hack. FLW.
</p>
<p>
Bloxsom wasn&#8217;t the only blog software I looked at, but it won on<br />
virtue of having no database dependency. I really like to avoid using<br />
RDBMS&#8217;es whenever I can, and the need for MySQL/Postgres to power this<br />
blog is really really not that big.
</p>
<p>
Having said that, I&#8217;m not 100% happy with blosxom either, in<br />
particular the way that the base install has very few features,<br />
instead relying on a extensive catalog of plug-ins to add<br />
functionality. I would think that this leads to features being poorly<br />
integrated, even conflicting, with each other. But I&#8217;ll probably have<br />
a more informed opinion once I try it out more extensively. Also, I<br />
don&#8217;t like that the posting date is the same as the file<br />
timestamp. Over time, I&#8217;ve managed to reset timestamps on a large<br />
amount of files in a number of circumstances, and it would be a pity<br />
if this metadata for my blog postings were to just disappear.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2004/08/17/back_again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

