Archiv der Kategorie: Projekt

WordPress Linked Data Plugin installieren

Mein WordPress-Plugin zur Veröffentlichung von Bloginhalten als Linked Data, kurz wp-linked-data, ist nun auch über das WordPress-Plugin-Repository verfügbar. Die Installation ist mit wenigen Klicks erledigt. Wie die meisten anderen Plugins könnt ihr es nun über eueren WordPress-Administrationsbereich finden und installieren. Sucht einfach nach „wp-linked-data“ oder „Linked Data“.

Auch eine offizielle Seite bei wordpress.org hat es nun. Ich freue mich über Bewertungen und Feedback.

WordPress Bloginhalte als Linked Data

Dieses Blog veröffentlicht nun selbst Linked Data, statt nur darüber zu berichten. Dazu habe ich ein kleines WordPress-Plugin geschrieben, das die Bloginhalte über Content-Negotiation auch in verschiedenen RDF-Formaten verfügbar macht.

Blogartikel als „abstraktes Ding“, nicht als HTML-Dokument, bekommen eine eigene, um #it erweiterte URI. Das Web-Dokument, das gerade in eurem Browser geöffnet ist, ist z.B. unter http://datenwissen.de/2013/04/wordpress-bloginhalte-als-linked-data erreichbar. Der Blogartikel den ihr lest, hat also den Identifier http://datenwissen.de/2013/04/wordpress-bloginhalte-als-linked-data#it

Ihr könnt die URI, z.B. mit einem Online-RDF-Browser abrufen, um die Daten zu sehen. Freunde der Konsole nutzen curl und setzten einen entsprechenden Accept-Header (text/turtle oder application/rdf+xml):

curl -H "Accept: text/turtle" http://datenwissen.de/2013/04/wordpress-bloginhalte-als-linked-data#it

Auch Blog-Autoren bekommen vom Plugin eine eigene URI, die in späteren Versionen als WebID nutzbar sein wird. Die URI der Autorenseite wird um #me erweitert, um die Person zu identifizieren. In diesem Blog werde ich also durch http://datenwissen.de/author/angelo#me identifiziert. Ruft die URI wie oben beschrieben ab, um das FOAF-Profil zu sehen, das sich dahinter verbirgt.

Update: Die Installation ist nun einfach über die WordPress-Admin-Oberfläche durchführbar. Den Quellcode gibt es natürlich trotzdem noch auf GitHub.
Das Plugin befindet sich noch nicht im WordPress-Plugin-Repository, ist jedoch bereits auf GitHub verfügbar. Kopiert einfach den Inhalt des /src-Verzeichnisses unter /wp-content/plugins/wp-linked-data und aktiviert das Plugin in der WordPress-Oberfläche.

groovyrdf vereinfacht WebID-Publizierung

In Version 0.2.1 vereinfacht groovyrdf nun auch die Veröffentlichung von RSA-Public-Keys. Dazu muss einfach die Methode ‚publicKey‘ innerhalb der den Key besitzenden Resource aufgerufen werden. In folgendem Beispiel bekommt Alice einen Public Key zugewiesen:

RdfData rdfData = rdfBuilder {
  "http://example.com/resource/alice" {
    publicKey (
      '#alicePublicKey',
      label: 'Public Key of Alice',
      modulus: '2cbf8fff963dea33ee7d4f007ae',
      exponent: 65537
    )
  }
}

Der obige Code erzeugt RDF gemäß der aktuellen WebID-Spezifikation:


<http://example.com/resource/alice>
 <http://www.w3.org/ns/auth/cert#key>
 <#alicePublicKey>.

<#alicePublicKey>
 a <http://www.w3.org/ns/auth/cert#RSAPublicKey>;
 <http://www.w3.org/2000/01/rdf-schema#label>
   "Public Key of Alice";
 <http://www.w3.org/ns/auth/cert#exponent>
   65537;
 <http://www.w3.org/ns/auth/cert#modulus>
   "2cbf8fff963dea33ee7d4f007ae"^^<http://www.w3.org/2001/XMLSchema#hexBinary> .

groovyrdf steht hier zum Download bereit. Ein ausführlicher User-Guide ist hier verfügbar.

picserv unterstützt WebID-Login

Meine in Entwicklung befindliche Bilder-Plattform picserv unterstützt nun auch ein WebID-Login.

WebID ist ein aufstrebender Standard, der uns losgelöst von zentralen Netzwerken wie Facebook und Google+ eine Identität im Social Web geben kann. WebID ist gleichzeitig ein Login-Verfahren und euer Profil im Social Web. Ein solches Profil könnt ihr z.B. bei my-profile.eu mit wenigen Klicks einrichten, ihr seid aber nicht von einzelnen Anbietern abhängig. Wer mag kann auch selbst ein Profil hosten.

Wenn ihr euch mit eurer WebID bei picserv einloggt, könnt ihr dort Bilder hochladen und kommentieren. Euer Name und eurer Bild wird aus eurem Profil ausgelesen und muss nicht nochmals bei picserv hinterlegt werden. Das ist das Schöne im dezentralen Social Web: Eure Identität und die Dienste, die ihr mit dieser Identität nutzt können auf völlig unterschiedlichen Servern liegen. Statt monolithischer Social-Network-Plattformen wird das Web zum Social Network. picserv leistet mit dem WebID-Login einen Beitrag zu dieser Entwicklung.

[notice]Bitte beachtet aber, dass sich picserv noch stark in Entwicklung befindet. Verlasst euch nicht darauf, dass der Dienst oder eure Bilder dauerhaft verfügbar sind![/notice]

[important]Ihr habt Fragen zu WebID oder Probleme beim Einrichten eines Profils? Ich helfe gerne weiter. Auch Anregungen zu picserv nehme ich gerne entgegen.[/important]

groovyrdf 0.2 veröffentlicht

Es ist mittlerweile schon über 1 Jahr her, dass ich mit groovyrdf eine Bibliothek zur einfachen Erzeugung von RDF-Daten mit Groovy veröffentlicht habe. Nun ist endlich das 2. Release da, und es bringt interessante Neuerungen mit sich.

Neben dem Erzeugen von RDF ist mit Version 0.2 auch das elegante Auslesen und Verarbeiten von Daten möglich. Mittels RdfLoader unterstützt groovyrdf das Laden von Linked Data Ressourcen inklusive Content-Negotiation. Die Daten können anschließend ausgelesen und weiter verarbeitet werden:

  // Namespace-Deklaration
  def foaf = new RdfNamespace ('http://xmlns.com/foaf/0.1/')

  // Laden einer Ressource mittels RdfLoader
  RdfLoader rdfLoader = new JenaRdfLoader()
  RdfResource person = rdfLoader.loadResource(
    'http://me.desone.org/person/aveltens#me'
  )

  println person(foaf.name) // Gibt 'Angelo Veltens' aus

Der Loader kümmert sich selbstständig um Content-Negotation und das Parsen des zurückgelieferten Formats. Solange RDF geliefert wird, kann es uns egal sein, ob dies vom Server in TURTLE, RDF/XML oder N3 ausgedrückt wird. Alle gängigen RDF-Syntaxen werden unterstützt. Der Zugriff auf die Eigenschaften der geladenen Resouce ist anschließend einfach über resource(predicateUri) möglich. Näheres erklärt der User Guide. Version 0.2 steht hier zum Download bereit und den Sourcecode gibt es nach wie vor bei GitHub.

[important]Wenn ihr groovyrdf nutzt, oder auch einfach nur kurz ausprobiert, freue ich mich über euer Feedback![/important]

Picserv: Bilderdienst für das Social Web of Data

Als Teil meines Engagements rund um dezentrale soziale Netzwerke habe ich ein weiteres Projekt gestartet: Einen Bilderdienst à la Twitpic, Arbeitstitel „picserv“.

Zum einen will ich schon lange weg von Twitpic und Co. Solche Dienste sind zwar kostenlos und praktisch, im Kleingedruckten oftmals jedoch nutzerfeindlich. Hinzu kommen die gernerellen Probleme von zentralisierten Diensten, die ich hier beschrieben habe.

Vor einigen Tagen habe ich eine erste Version online genommen, erreichbar unter http://picserv.desone.org. Da meine Serverressourcen begrenzt sind, kann nur ich dort Bilder hochladen. Ihr könnt euch jedoch über Twitter einloggen und Kommentare hinterlassen. Und schließlich ist es ja auch im Sinne der Dezentralisierung, dass sich möglichst viele Menschen eine eigene Instanz von „picserv“ oder ähnlichen Diensten installieren. (Bei Interesse, sagt mir Bescheid)

Als nächstes möchte ich über den Dienst auch Linked Data zur Verfügung stellen, damit die Bilder und Kommentare Teil des Web of Data werden. Auch ein Login über WebID soll möglich werden. Dadurch kann man sein Profil und seine Bilder bei zwei völlig unterschiedlichen Diensten / Servern hosten und trotzdem ist beides im Sinne des „Social Webs“ miteinander verknüpft.

[important]Habt ihr ebenfalls ein interessantes Social-Web-Projekt und möchtet es Teil des Web of Data werden lassen? Ich helfe gerne weiter, wenn ihr noch nicht so richtig wisst wie![/important]

Linked Data Social Network

Ich beschäftige mich nicht nur theoretisch mit den Themen Linked Data und dezentralen sozialen Netzwerken, sondern arbeite derzeit auch ganz konkret an einer Social Network Plattform auf Basis von Linked Data. Dass was ich seit gestern online habe, würde ich aber nicht mal als Pre-Alpha bezeichnen, also erwartet nicht zu viel, falls ihr auf den gleich folgenden Link klickt.

Mein Projekt „Desone“ (Decentralized Social Network) hat derzeit auch noch wenig mit „Networking“ zu tun. Es ist eher ein Profil-Hoster und derzeit auch nur für mein eigenes Profil (Anmeldung ist noch nicht möglich, klickt so oft auf Login wie ihr wollt). Editierfunktionen bietet es auch noch nicht (nichtmal für mich selbst). Kommt aber alles noch!

Zum „Network“ wird das ganze aber dann doch wieder, weil Desone natürlich Linked Data bereitstellt. In meiner Bekanntenliste verlinke ich auf meine Kontakte bei identi.ca (StatusNet stellt praktischerweise FOAF bereit) und Twitter (semantictweet.com machts möglich) sowie auf einige wenige Personen die selbst ein FOAF-Profil hosten.

Meine Interessen verlinken zudem auf die DBpedia und mein Wohnort auf geonames.org. Wie ihr seht, sind dank Linked Data also schon sehr viele Angaben möglich, ohne das Desone selbst diese Informationen (z.B. Orte, Interessen) hosten muss. Desone hostet nur das Profil, den Rest stellt praktischerweise das Web of Data bereit.

Genug der langen Rede, schauts euch an, wenn ihr mögt: http://me.desone.org/person/aveltens#me

An die RDF-Daten kommt ihr dank Grails Content-Negotiation auf folgenden Wegen:

Ich werde euch natürlich über das Projekt auf dem Laufenden halten.

RDF auf Groovy-Art

Wie bereits angekündigt arbeite ich derzeit an einer Domain-Specific-Language / Bibliothek um RDF mit Groovy zu erzeugen. Das erste Release ist nun verfügbar. Die Vorzüge erkennt man am besten an einem kleinen Code-Beispiel:

RdfData rdfData = rdfBuilder {
  "http://example.com/resource/alice" {
     a "http://example.com/vocab/Person"
    "http://example.com/vocab/name" "Alice"
  }
}

Dieser Ausdruck ist äquivalent zu folgenden RDF-Daten im TURTLE-Format:

<http://example.com/resource/alice>
  a <http://example.com/vocab/Person>;
  <http://example.com/vocab/name> "Alice".
Nett, oder? Interessant wird das ganze natürlich erst, mit ein wenig Dynamik:
def person = new Person (...)

RdfData rdfData = rdfBuilder {
  "http://example.com/resource/${person.nick}" {
     a "http://example.com/vocab/Person"
    "http://example.com/vocab/name" person.name
    "http://example.com/vocab/knows" {
      person.friends.each { friend ->
        "http://example.com/resource/${friend.nick}" {}
      }
    }
  }
}

Die ganze Sprachvielfalt von Groovy steht zur Verfügung. Die Daten lassen sich dann in beliebigen Repräsentation schreiben, z.B. RDF/XML oder TURTLE. Mehr Code-Beispiele und Erklärungen gibts im User Guide. Version 0.1 steht hier zum Download bereit und den Sourcecode gibt es bei GitHub.

Freue mich über Feedback und weitere Ideen. Wer zur weiteren Entwicklung beitragen möchte, forkt einfach das Projekt bei GitHub und sendet mir ein Pull-Request.

Linked Data Thesaurus

Linked Data Thesaurus ist ein kleines Projekt von mir, das die Daten von openthesaurus.de als Linked Data verfügbar macht. OpenThesaurus ist ein freies deutsches Synonymwörterbuch, welches seine Daten auch über eine offene API zur Verfügung stellt. Allerdings liefert diese API lediglich unverlinkte XML-Dokumente aus. Der Linked Data Thesaurus ergänzt den Dienst, indem die Daten zusätzlich in Form von RDF bereitgestellt werden. Ein Begriff bekommt beim Linked Data Thesaurus eine URI der folgenden Form:

http://thesaurus.datenwissen.de/Begriff#term

Synonyme zum Begriff „Daten“ sind somit unter folgender URI abrufbar:

http://thesaurus.datenwissen.de/Daten#term

Es handelt sich dabei um eine Nicht-Informationsressource. Der Fragmentbezeichner #term wird wie üblich beim Abruf per Browser abgetrennt und die Informationsressource http://thesaurus.datenwissen.de/Daten wird vom Server zurückgeliefert. Abhängig vom HTTP-Accept-Header liefert Linked Data Thesaurus entweder ein RDF/XML- (application/rdf+xml) oder Turtle-Dokument (text/turtle) aus. Im Firefox kann der Accept Header mit dem Plugin Modify Headers geändert werden. Andernfalls werden die originalen XML-Daten der OpenThesaurus-API zurückgeliefert! Im Folgenden erkläre ich den Aufbau der Daten anhand des Turtle-Formats und dem Begriff „Daten“. Der Begriff selbst ist vom Typ Label aus der SKOS-XL Ontologie. Das eigentliche Textliteral wird inklusive Sprachangabe über das Attribut skosxl:literalForm angefügt:

<Daten#term>
  a <http://www.w3.org/2008/05/skos-xl#Label>;
  <http://www.w3.org/2008/05/skos-xl#literalForm> "Daten"@de.

OpenThesaurus gruppiert Synonyme in sogenannten SynSets. Dabei handelt es sich um Gruppen von Begriffen mit der gleichen Bedeutung. Ein Begriff mit mehreren Bedeutungen kommt somit in unterschiedlichen SynSets vor, mit jeweils unterschiedlichen Synonymen die den jeweiligen Bedeutungen entsprechen. Zum Beispiel ist das Wort Schild zum einen in einem SynSet mit „Schutzwaffe“ und in einem anderen mit „Zeichen“.

Ein SynSet wird durch den Linked Data Thesaurus als skos:Concept abgebildet. Der abgefragte Begriff wird über das Attribut skosxl:prefLabel angefügt und alle Synonyme über skosxl:altLabel. Hier eines der SynSets in denen der Begriff „Daten“ vorkommt:

<#synset1>
  a <http://www.w3.org/2004/02/skos/core#Concept>;
  <http://www.w3.org/2008/05/skos-xl#altLabel>
    <Informationen#term>,
    <Angaben#term>,
    <Aussagen#term>,
    <Datensammlung#term>,
    <Unterlagen#term>;
  <http://www.w3.org/2008/05/skos-xl#prefLabel>
    <Daten#term>.

Ich freue mich über Feedback zum Linked Data Thesaurus und über die Art und Weise wie die Daten strukturiert sind. Es ist sicherlich noch nicht der Weisheit letzter Schluss, aber ein Anfang. Der OpenThesaurus stellt noch ein paar mehr Daten bereit, die ich gerne noch einbinden möchte und auch eine Verlinkung mit Lexvo.org habe ich bereits im Hinterkopf.

Wer mitarbeiten möchte kann sich gerne an mich wenden, oder einfach den Quellcode von GitHub beziehen und loslegen.