Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:dydaktyka:semweb:lab-sparql [2018/09/12 14:32]
kkutt 2018 fixes
pl:dydaktyka:semweb:lab-sparql [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 ====== Querying the Semantic Web with SPARQL ====== ====== Querying the Semantic Web with SPARQL ======
  
-^  Last verification:​ | 20180912 ​|+^  Last verification:​ | 20180914 ​|
 ^  Tools required for this lab: | -- | ^  Tools required for this lab: | -- |
  
Linia 15: Linia 15:
  
 ===== Lab instructions ===== ===== Lab instructions =====
 +
 +During this lab we will use two services to execute SPARQL queries:
 +  - <wrap caution>​[[http://​tw.rpi.edu/​endpoint/​sparql.html|SPARQLer]]</​wrap>​ (a general purpose SPARQL query processor) will be used for querying RDF files.
 +  - <wrap caution>​[[http://​yasgui.org/​|YASGUI]]</​wrap>​ (Yet Another Sparql GUI) will be used for querying SPARQL Endpoints (it has more powerful editor, but it can't be used against simple RDF files :-()
 +
 ==== - Introduction [5 minutes] ==== ==== - Introduction [5 minutes] ====
   - What can we do with our RDF models? In this section some "​magic"​ will happen on [[wp>​Periodic_table|Periodic Table]] saved in [[http://​www.daml.org/​2003/​01/​periodictable/​PeriodicTable.owl|RDF]]!   - What can we do with our RDF models? In this section some "​magic"​ will happen on [[wp>​Periodic_table|Periodic Table]] saved in [[http://​www.daml.org/​2003/​01/​periodictable/​PeriodicTable.owl|RDF]]!
-  - Open <wrap caution>[[http://​tw.rpi.edu/​endpoint/​sparql.html|SPARQLer]]</​wrap>​ (a general purpose SPARQL query processor)+  - Open **[[http://​tw.rpi.edu/​endpoint/​sparql.html|SPARQLer]]**
-  - Paste ''<​nowiki>​http://​www.daml.org/​2003/​01/​periodictable/​PeriodicTable.owl</​nowiki>''​ into "​Target graph URI (or use FROM in the query)"​ fieldselect ''​Text'' ​in "​Output"​ dropdown list.+  - Paste ''<​nowiki>​http://​www.daml.org/​2003/​01/​periodictable/​PeriodicTable.owl</​nowiki>''​ into "​Target graph URI (or use FROM in the query)"​ field and select ''​text output'' ​option. 
 +    * There is also a backup (if original URI cannot be resolved): ''<​nowiki>​http://​krzysztof.kutt.pl/​didactics/​semweb/​PeriodicTable.owl</​nowiki>''​
   - Run the following two queries (paste code in text field and click ''​Get Results''​):<​code | select.rq>​PREFIX table: <​http://​www.daml.org/​2003/​01/​periodictable/​PeriodicTable#>​   - Run the following two queries (paste code in text field and click ''​Get Results''​):<​code | select.rq>​PREFIX table: <​http://​www.daml.org/​2003/​01/​periodictable/​PeriodicTable#>​
 PREFIX xsd: <​http://​www.w3.org/​2001/​XMLSchema#>​ PREFIX xsd: <​http://​www.w3.org/​2001/​XMLSchema#>​
Linia 27: Linia 33:
   ?group table:name "Noble gas"​^^xsd:​string .   ?group table:name "Noble gas"​^^xsd:​string .
   ?element table:name ?name .   ?element table:name ?name .
-} +}</​code><​code | construct.rq>​PREFIX table: <​http://​www.daml.org/​2003/​01/​periodictable/​PeriodicTable#>​
-ORDER BY ASC(?name)</​code><​code | construct.rq>​PREFIX table: <​http://​www.daml.org/​2003/​01/​periodictable/​PeriodicTable#>​+
 PREFIX xsd: <​http://​www.w3.org/​2001/​XMLSchema#>​ PREFIX xsd: <​http://​www.w3.org/​2001/​XMLSchema#>​
 PREFIX rdfs: <​http://​w3.org/​2000/​01/​rdf-schema#>​ PREFIX rdfs: <​http://​w3.org/​2000/​01/​rdf-schema#>​
Linia 39: Linia 44:
   ?group table:name "Noble gas"​^^xsd:​string .   ?group table:name "Noble gas"​^^xsd:​string .
   ?element table:name ?name .   ?element table:name ?name .
-} +}</​code>​
-ORDER BY ASC(?name)</​code>​+
      * Both queries run on the same dataset      * Both queries run on the same dataset
      * Both queries extract the same data: list of all elements in [[wp>​Noble_gas|Noble gases]] group with their names      * Both queries extract the same data: list of all elements in [[wp>​Noble_gas|Noble gases]] group with their names
Linia 50: Linia 54:
  
   * General Idea: **SPARQL is an RDF graph pattern matching system.**   * General Idea: **SPARQL is an RDF graph pattern matching system.**
-  * E.g.: there is a triple saved in RDF: <​code>:​JamesDean ​:playedIn ​:Giant .</​code>​+  * E.g.: there is a triple saved in RDF: <​code>:​Hydrogen ​:standardState ​:gas .</​code>​
   * Now we can simply replace part of the triple with a question word (with a question mark at the start) and we get simple queries, e.g.:   * Now we can simply replace part of the triple with a question word (with a question mark at the start) and we get simple queries, e.g.:
-    * //Query:// '':​JamesDean ​:playedIn ​**?what** .''​ \\ //Answer:// '':​Giant''​ +    * //Query:// '':​Hydrogen ​:standardState ​**what?** .''​ \\ //Answer:// '':​gas''​ 
-    * //Query:// ''​**?​who** :playedIn ​:Giant .''​ \\ //Answer:// '':​JamesDean''​ +    * //Query:// ''​**?​what** :standardState ​:gas .''​ \\ //Answer:// '':​Hydrogen''​ 
-    * //Query:// '':​JamesDean ​**?what** :Giant .''​ \\ //Answer:// '':​playedIn''​+    * //Query:// '':​Hydrogen ​**?what** :gas .''​ \\ //Answer:// '':​standardState''​
  
-  - Let'​s ​get back to our [[.:​lab-rdfmodel#​foaf_10_minutes|FOAF files]]. Do you have yours? 8-O +  - Now, let'​s ​do some more queries ​against Periodic TablePrepare the following ones
-  - Execute ​queries ​on your foaf file (or on ''<​nowiki>​http://​krzysztof.kutt.pl/​foaf.rdf</​nowiki>''​ file) to retrieve+    * __elements which have name and symbol defined__ 
-    * friends who have name and e-mail ​defined +    * elements which have name and symbol ​defined ​__and are placed in ''​period_7''​ period__ 
-    * friends who have name and e-mail ​defined and optional homepage +    * elements which have name and symbol ​defined and are placed in ''​period_7''​ period __and have OPTIONAL color__ (some of them does not have color!) 
-    * friends who have name and e-mail ​defined and optional homepagesorted ​by name descending+    * elements which have name and symbol ​defined and are placed in ''​period_7''​ period and have OPTIONAL color__sorted ​by name descending__
   - 8-) Put the constructed queries in the report.   - 8-) Put the constructed queries in the report.
     * **Hints:**     * **Hints:**
       * [[http://​www.w3.org/​TR/​sparql11-query/#​optionals|SPARQL 1.1 documentation]] may be useful for specifying optional values       * [[http://​www.w3.org/​TR/​sparql11-query/#​optionals|SPARQL 1.1 documentation]] may be useful for specifying optional values
       * [[http://​xmlns.com/​foaf/​spec/​|FOAF Vocabulary Specification]]       * [[http://​xmlns.com/​foaf/​spec/​|FOAF Vocabulary Specification]]
-      * Type in the location of your file in the ''​Target graph URI ''​ OR use ''​FROM''​ construct to define your data source, e.g. <​code>​ 
-PREFIX rdf: <​http://​www.w3.org/​1999/​02/​22-rdf-syntax-ns#>​ 
-PREFIX foaf: <​http://​xmlns.com/​foaf/​0.1/>​ 
- 
-SELECT DISTINCT ?name 
-FROM <​http://​krzysztof.kutt.pl/​foaf.rdf>​ 
-WHERE {  
-    ?x rdf:type foaf:Person .  
-    ?x foaf:name ?name 
-} 
-LIMIT 10</​code>​ 
  
 ==== - Constraints:​ FILTER [10 minutes] ==== ==== - Constraints:​ FILTER [10 minutes] ====
  
-  * After matching RDF graph pattern, there is also possibility to put some constraints on the rows that will be excluded or included in the results. This is achieved using FILTER construct. Let's try it now on the [[.:​lab-rdfmodel#​foaf_10_minutes|FOAF files of your friends]]+  * After matching RDF graph pattern, there is also possibility to put some constraints on the rows that will be excluded or included in the results. This is achieved using FILTER construct. Let's try it now on the Periodic Table
-  * Prepare and execute queries ​on chosen FOAF file to retrive: +  * Prepare and execute queries to retrive: 
-    * people whose name starts with 'K+    * elements which name starts with 's
-    * people having e-mails on student.agh.edu.pl server +    * elements which has digit '​2'​ in atomicNumber 
-    * people whose name starts with 'K' **or** ​who have e-mails on student.agh.edu.pl server, make search caseinsensitive +    * elements which name starts with 's' **or** ​which has digit '​2'​ in atomicNumber, make search caseinsensitive
-    * name of people, who have homepage **or** e-mail on student.agh.edu.pl server+
   * **Hints:**   * **Hints:**
-    * cooperate, ask your friends to give you the URI of their FOAF :!: 
     * SPARQL 1.1 Documentation parts about [[http://​www.w3.org/​TR/​sparql11-query/#​termConstraint|constraints]] and [[http://​www.w3.org/​TR/​sparql11-query/#​alternatives|alternatives]] may be useful     * SPARQL 1.1 Documentation parts about [[http://​www.w3.org/​TR/​sparql11-query/#​termConstraint|constraints]] and [[http://​www.w3.org/​TR/​sparql11-query/#​alternatives|alternatives]] may be useful
   * 8-) Put the queries in the report.   * 8-) Put the queries in the report.
Linia 93: Linia 84:
  
   * SPARQL queries may be asked against RDF file as we did in previous sections. But there is also possibility to use special purpose web service called SPARQL Endpoint. It wraps some data set and provides a service that responds to the SPARQL protocol, providing access to the data set.   * SPARQL queries may be asked against RDF file as we did in previous sections. But there is also possibility to use special purpose web service called SPARQL Endpoint. It wraps some data set and provides a service that responds to the SPARQL protocol, providing access to the data set.
-  * Many SPARQL Endpoints are available today, providing information about a variety of subjects. In this section we will use [[http://​dbpedia.org/​|DBpedia]] SPARQL Endpoint at **http://​dbpedia.org/​sparql**.+  * Many SPARQL Endpoints are available today, providing information about a variety of subjects. In this section we will use [[http://​dbpedia.org/​|DBpedia]] SPARQL Endpoint at **''<​nowiki>​http://​dbpedia.org/​sparql</​nowiki>''​**.
  
-  - DBpedia is a dump of Wikipedia annotated using RDF. So, like Wikipedia, DBpedia should contain some information about Poland. What we can do? \\ We don't know what URI Poland has in DBpedia, but we know the name Poland, and from previous lab we know rdfs:label property. Maybe this will help us? Let's try! +  - DBpedia is a dump of Wikipedia annotated using RDF. So, like Wikipedia, DBpedia should contain some information about Poland. What we can do? \\ We don't know what URI Poland has in DBpedia, but we know the name Poland, and from previous lab we know ''​rdfs:label'' ​property. Maybe this will help us? Let's try! 
-  - Open the [[http://tw.rpi.edu/endpoint/​sparql.html|SPARQLer]]. What we know so far? There should be some URI (''?​country''​) that probably has a relation ''​rdfs:​label''​ with object ''"​Polska"​@pl''​. This can be easily translated into SPARQL WHERE clause: <​code>?​country rdfs:label "​Polska"​@pl .</​code>​ +  - Open the **[[http://yasgui.org/|YASGUI]]**. 
-  - To execute this query properly ​we also have to specify that we are asking ​''<​nowiki>​http://​dbpedia.org/​sparql</​nowiki>'' ​EndpointWe can't use FROM clausebecause this one is designated for RDF graphs. We should use SERVICE instead. Final query:<​code>​PREFIX rdfs: <​http://​www.w3.org/​2000/​01/​rdf-schema#>​+  - What we know so far? There should be some URI (''?​country''​) that probably has a relation ''​rdfs:​label''​ with object ''"​Polska"​@pl''​. This can be easily translated into SPARQL WHERE clause: <​code>?​country rdfs:label "​Polska"​@pl .</​code>​ 
 +  - To execute this query properly, enter the ''<​nowiki>​http://​dbpedia.org/​sparql</​nowiki>'' ​URI in the dropdown list at the top. 
 +  - Thenspecify the query:<​code>​PREFIX rdfs: <​http://​www.w3.org/​2000/​01/​rdf-schema#>​
 SELECT ?country SELECT ?country
 WHERE {  WHERE { 
-    ​SERVICE <​http://​dbpedia.org/​sparql>​ { +    ?country rdfs:label "​Polska"​@pl . 
-        ​?country rdfs:label "​Polska"​@pl . +}</​code>​ 
-    } +  - Success! There is something that has ''​rdfs:​label''​ ''"​Polska"​@pl''​! \\ 8-) Now expand this query to find information about Poland population ​and put the final query in the report. 
-}</​code>​**Note 1**: There must be something in ''​Target graph URI''​ field (this can be FOAF URI from previous section) -- this URI will not be used in query but SPARQLer needs it to execute query... \\ **Note 2: ** You can use more than one ''​SERVICE''​ clauses in SPARQL query -- it gives you a possibility to combine results from different SPARQL Endpoints. +      ​Hint: result should look like this: <​code>​--------------
-  - Success! There is something that has ''​rdfs:​label''​ ''"​Polska"​@pl''​! \\ Now expand this query to find information about Poland population+
-    - 8-) Put the final query in the report. +
-      ​Hint: result should look like this: <​code>​--------------+
 | population | | population |
 ============== ==============
Linia 122: Linia 112:
  
   - Poland is divided into 16 voivodeships (PL: województwo),​ and then into 380 counties (PL: powiat). In this task, we will examine it closer.   - Poland is divided into 16 voivodeships (PL: województwo),​ and then into 380 counties (PL: powiat). In this task, we will examine it closer.
-  - Prepare a query (in [[http://tw.rpi.edu/endpoint/​sparql.html|SPARQLer]], against DBpedia) which returns list of voivodeships and number of counties inside them. List should consist only of voivodeships with 7 or more counties and should be ordered by number of counties.+  - Prepare a query (in [[http://yasgui.org/|YASGUI]], against DBpedia) which returns list of voivodeships and number of counties inside them. List should consist only of voivodeships with 7 or more counties and should be ordered by number of counties.
   - Results should look like that:<​code>​------------------------------------------------   - Results should look like that:<​code>​------------------------------------------------
 | voivodeship ​                      | counties | | voivodeship ​                      | counties |
Linia 148: Linia 138:
   - **Hint** -- useful URIs:   - **Hint** -- useful URIs:
     * county: ''<​nowiki>​http://​dbpedia.org/​resource/​Powiat</​nowiki>''​     * county: ''<​nowiki>​http://​dbpedia.org/​resource/​Powiat</​nowiki>''​
-    * voivodeship:​ ''<​nowiki>​http://​dbpedia.org/​resource/​Voivodeship_(Poland)</​nowiki>''​+    * voivodeship:​ ''<​nowiki>​http://​dbpedia.org/​resource/​Voivodeships_of_Poland</​nowiki>''​
   - 8-) Put the query in the report.   - 8-) Put the query in the report.
  
Linia 178: Linia 168:
     - You don't have ''​is_sibling_of''​ but instead you have ''​is_sister_of''​ and ''​is_brother_of''​. Simply prepare query (or queries) that creates ''​is_sibling_of''​ for you.     - You don't have ''​is_sibling_of''​ but instead you have ''​is_sister_of''​ and ''​is_brother_of''​. Simply prepare query (or queries) that creates ''​is_sibling_of''​ for you.
       * 8-) Put this query in the report.       * 8-) Put this query in the report.
 +      * **Note:** this query have to be executed in [[http://​tw.rpi.edu/​endpoint/​sparql.html|SPARQLer]] (not in YASGUI)
 +      * **Note 2:** your dataset has to be available online as a **RAW file**, e.g. if you has the file on Dropbox, you have to change the ''<​nowiki>​www.dropbox.com</​nowiki>''​ part of the shared link to ''<​nowiki>​dl.dropboxusercontent.com</​nowiki>''​
  
   * OK, we created some new RDF triples using CONSTRUCT query. What now? Depending on your plans, you can:   * OK, we created some new RDF triples using CONSTRUCT query. What now? Depending on your plans, you can:
Linia 191: Linia 183:
  
   * **ASK queries** simply provide Yes/No answer and no information about founded triples (in case of "​Yes"​ answer).   * **ASK queries** simply provide Yes/No answer and no information about founded triples (in case of "​Yes"​ answer).
-    * E.g. Is there anyone ​with name "Krzysztof Kluza" in this data set? <​code>​PREFIX ​foaf   <http://xmlns.com/foaf/0.1/> +    * E.g. Is there anything ​with name "aluminium" in this data set? <​code>​PREFIX ​table: <http://www.daml.org/2003/01/​periodictable/​PeriodicTable#>​ 
-ASK  { ?x foaf:name  "Krzysztof Kluza" }</​code>​ If you run this query against ​''<​nowiki>​http://​krzysztof.kutt.pl/​foaf.rdf</​nowiki>''​ file answer will be yes.+PREFIX xsd: <​http://​www.w3.org/2001/XMLSchema#> 
 + 
 +ASK { 
 +  ​?element table:name "aluminium"^^xsd:​string . 
 +}</​code>​ If you run this query against ​Periodic Table, ​answer will be yes.
     * 8-) Prepare query that checks something interesting in your [[.:​lab-rdfmodel2|model]] :)     * 8-) Prepare query that checks something interesting in your [[.:​lab-rdfmodel2|model]] :)
       * If you have no idea what you can check, you can simply prepare a query that checks if there is anything that is a ''​MusicCD''​ and was published by ''​Warner Music Group''​ (if you don't have such classes in your library, use analogous class that you have).       * If you have no idea what you can check, you can simply prepare a query that checks if there is anything that is a ''​MusicCD''​ and was published by ''​Warner Music Group''​ (if you don't have such classes in your library, use analogous class that you have).
  
   * **DESCRIBE queries** return all knowledge associated with given Subject URI(s). ​   * **DESCRIBE queries** return all knowledge associated with given Subject URI(s). ​
-    * The simplest DESCRIBE query specifies only the URI that should be described: <​code>​DESCRIBE <http://krzysztof.kutt.pl/foaf.rdf#me></​code>​ (it should be executed against ''<​nowiki>​http://​krzysztof.kutt.pl/foaf.rdf</​nowiki>''​ file)+    * The simplest DESCRIBE query specifies only the URI that should be described: <​code>​DESCRIBE <http://www.daml.org/2003/​01/​periodictable/​PeriodicTable#H></​code>​ (it should be executed against ''<​nowiki>​http://​www.daml.org/​2003/​01/​periodictable/PeriodicTable.owl</​nowiki>''​ file)
     * There is also possibility to select URI(s) from data set using constraints defined in WHERE clause. Read about it in [[http://​www.w3.org/​TR/​sparql11-query/#​describe|SPARQL 1.1 documentation]].     * There is also possibility to select URI(s) from data set using constraints defined in WHERE clause. Read about it in [[http://​www.w3.org/​TR/​sparql11-query/#​describe|SPARQL 1.1 documentation]].
     * 8-) Prepare query that describes all ''​foaf:​Person''​ items from your [[.:​lab-rdfmodel2|model]] (if you don't have a ''​foaf:​Person''​ class in your library, use analogous class that you have).     * 8-) Prepare query that describes all ''​foaf:​Person''​ items from your [[.:​lab-rdfmodel2|model]] (if you don't have a ''​foaf:​Person''​ class in your library, use analogous class that you have).
Linia 207: Linia 203:
     * SQL: Closed World Assumption     * SQL: Closed World Assumption
   * Let's imagine that we are preparing query about all the living actors who played in [[wp>​Return of the Jedi|Star Wars Episode VI: Return of the Jedi]].   * Let's imagine that we are preparing query about all the living actors who played in [[wp>​Return of the Jedi|Star Wars Episode VI: Return of the Jedi]].
-    * Idea scheme ​of this query in RDF: <​code>​SELECT ?actor+    * Scheme ​of this query in RDF: <​code>​SELECT ?actor
 WHERE {?actor :playedIn :​ReturnOfTheJedi . WHERE {?actor :playedIn :​ReturnOfTheJedi .
        NOT EXISTS {?actor :diedOn ?deathdate . }        NOT EXISTS {?actor :diedOn ?deathdate . }
Linia 220: Linia 216:
     * 8-) What are Open World Assumption (OWA) and Close World Assumption (CWA)?     * 8-) What are Open World Assumption (OWA) and Close World Assumption (CWA)?
     * 8-) What is the difference between these two queries (refer to the knowledge of OWA and CWA)?     * 8-) What is the difference between these two queries (refer to the knowledge of OWA and CWA)?
 +
 +==== - Wikipedia, DBpedia, Wikidata ====
 +
 +If you are interested in querying the huge amount of data available in Wikipedia, there are two projects you may be interested in:
 +  * [[https://​dbpedia.org/​|DBpedia]] -- an attempt to extract data from Wikipedia infoboxes and links (using developed parsers)
 +  * [[https://​www.wikidata.org/​|Wikidata]] -- an attempt to create an RDF base from scratch by the community (using provided GUI)
 +
 +They overlap in part, but are independent of each other and have different uses. For you, a student of the Semantic Web Technologies course, it does not matter much. They are simply large knowledge bases with which you can do a lot of things.\\
 +If you want to dive into this data you can start with a **[[https://​www.wikidata.org/​wiki/​Wikidata:​SPARQL_query_service/​queries/​examples|Big set of SPARQL queries against Wikidata]]**.
  
 ===== Control questions ===== ===== Control questions =====
Linia 233: Linia 238:
   * [[http://​www.w3.org/​TR/​sparql11-overview/​|SPARQL 1.1 Overview]]   * [[http://​www.w3.org/​TR/​sparql11-overview/​|SPARQL 1.1 Overview]]
   * [[http://​www.cambridgesemantics.com/​semantic-university/​learn-sparql|Learn SPARQL @Cambridge Semantics]]   * [[http://​www.cambridgesemantics.com/​semantic-university/​learn-sparql|Learn SPARQL @Cambridge Semantics]]
 +  * You can combine results from many SPARQL Endpoints in one query -- see [[https://​www.w3.org/​TR/​sparql11-federated-query/​|SPARQL Federated Query]] for more information.
  
 Sample queries in SPARQL: Sample queries in SPARQL:
 +  * [[http://​chem-bla-ics.blogspot.com/​2018/​09/​wikidata-query-service-recipe.html|Wikidata Query Service recipe: qualifiers and the Greek alphabet]]
   * **[[https://​www.wikidata.org/​wiki/​Wikidata:​SPARQL_query_service/​queries/​examples|Big set of SPARQL queries against Wikidata]]**   * **[[https://​www.wikidata.org/​wiki/​Wikidata:​SPARQL_query_service/​queries/​examples|Big set of SPARQL queries against Wikidata]]**
   * [[pl:​dydaktyka:​semweb:​2014:​projects:​loddemo|Linked Open Data - demo]] (//in Polish//)   * [[pl:​dydaktyka:​semweb:​2014:​projects:​loddemo|Linked Open Data - demo]] (//in Polish//)
-  * [[https://blog.semantic-web.at/​2015/​09/​29/​sparql-analytics-proves-boxers-live-dangerously/​|SPARQL analytics proves boxers live dangerously]]+  * [[https://​semantic-web.com/​2015/​09/​29/​sparql-analytics-proves-boxers-live-dangerously/​|SPARQL analytics proves boxers live dangerously]]
   * [[http://​www.snee.com/​bobdc.blog/​2017/​11/​sparql-queries-of-beatles-reco.html|SPARQL queries of Beatles recording sessions]]   * [[http://​www.snee.com/​bobdc.blog/​2017/​11/​sparql-queries-of-beatles-reco.html|SPARQL queries of Beatles recording sessions]]
  
pl/dydaktyka/semweb/lab-sparql.1536755535.txt.gz · ostatnio zmienione: 2019/06/27 15:55 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0