<?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; sparql</title>
	<atom:link href="http://blog.tomtebo.org/tag/sparql/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>Is the 27 club a myth? Maybe not.</title>
		<link>http://blog.tomtebo.org/2012/01/01/is-the-27-club-a-myth-maybe-not/</link>
		<comments>http://blog.tomtebo.org/2012/01/01/is-the-27-club-a-myth-maybe-not/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 14:47:31 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[dbpedia]]></category>
		<category><![CDATA[rock]]></category>
		<category><![CDATA[sparql]]></category>
		<category><![CDATA[statistics]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=974</guid>
		<description><![CDATA[A recent study published in the British Medical Journal, widely linked (NYT, Jezebel, Andrew Sullivan) claims that there is no statistical support for the assumption that rock stars die more frequently at the age of 27 (aka the 27 club &#8230; <a href="http://blog.tomtebo.org/2012/01/01/is-the-27-club-a-myth-maybe-not/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A recent <a href="http://www.bmj.com/content/343/bmj.d7799#ref-7">study</a> published in the British Medical Journal, widely linked (<a href="http://well.blogs.nytimes.com/2011/12/26/really-the-claim-for-famous-musicians-27-is-a-dangerous-age/">NYT</a>, <a href="http://jezebel.com/5871191/rock-stars-arent-more-likely-to-drop-dead-at-27">Jezebel</a>, <a href="http://andrewsullivan.thedailybeast.com/2011/12/the-rock-star-death-age-1-1.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+andrewsullivan%2FrApM+%28The+Daily+Dish%29">Andrew Sullivan</a>) claims that there is no statistical support for the assumption that rock stars die more frequently at the age of 27 (aka the <a href="http://en.wikipedia.org/wiki/27_Club">27 club meme</a>)</p>
<p>However, the study used a sampling scheme that excluded four of the most well known members of the 27 club (Robert Johnson, Jimi Hendrix, Janis Joplin and Jim Morrisson). Furthermore, it only included 71 musicians that actually died. This seems to me to be a very small sample. Can we procure a better sample?</p>
<p>Using <a href="http://dbpedia.org/snorql/">DBPedia</a> (the structured database containing facts gathered from Wikipedia), I selected a list of dead musicians that were born after 1900 using a somewhat simple SPARQL query:</p>
<pre>
PREFIX dbo:
SELECT DISTINCT ?person ?birth ?death WHERE {
     ?person dbo:birthDate ?birth .
     ?person dbo:deathDate ?death .
     ?person rdf:type ?musician
     FILTER (regex(str(?musician), "Musicians"))
     FILTER (?birth &gt;= "1900-01-01"^^xsd:date) .</pre>
<p>This yields a list of almost 2500 persons. When plotting a histogram for the age of these musicians, we get the following view:</p>
<p><a href="http://blog.tomtebo.org/wp-content/uploads/2012/01/27club-dbpedia.png"><img class="aligncenter size-large wp-image-975" title="27club-dbpedia" src="http://blog.tomtebo.org/wp-content/uploads/2012/01/27club-dbpedia-1024x384.png" alt="" width="640" height="240" /></a><br />
It seems to me that there is a small but significant spike at 27 (154 % increased chance of death compared to the year before), with a secondary spike at 32 (78 % increased chance). This shows the value of selecting a good sample when using statistical analysis. </p>
<p>Furthermore, it shows the value of structured data. I fixed the above charts by fiddling with SPARQL queries for half an hour, then about an hour of fiddling with Excel. I believe my criteria (&#8221;Dead musician famous enough to have a Wikipedia article&#8221;) is better than the one used in the study (&#8221;Artists with a number one UK album&#8221;). But if you disagree, you can easily modify the SPARQL query to work with a different study sample. Let me know your results!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2012/01/01/is-the-27-club-a-myth-maybe-not/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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>
	</channel>
</rss>

