Sign in to edit and +1 items.
Login required
Download

RDFa Plugin

(1)
Author(s) Matthias Quasthoff
Current Release 0.1.1   (2 years ago)
Grails Version 1.1.1 > *
Tags rdf  rdfa 
Dependency
compile ":rdfa:0.1.1"
Last updated by admin 2 years ago
grails install-plugin rdfa
Last updated by mquasthoff 2 years ago

RDFa Plug-in

The RDFa plug-in allows you to expose relevant parts of the structure of your application as RDFa annotations in your views. Both domain model (non-information resources) and controller actions (information resources) can be described.

Installation

To install the RDFa plug-in just run the following command

grails install-plugin rdfa

Usage

The RDFa plug-in provides a RDFaTagLib that can be used in any of your Grails views. To achieve this, the plug-in processes Groovy-to-RDF mappings in the domain model and in controllers.

Model mapping

An example of how to expose the domain model as RDFa can be seen below.

class Person {
	static rdf = [
		'':'http://xmlns.com/foaf/0.1/Person',
		'name':'http://xmlns.com/foaf/0.1/name',
		'friends':'http://xmlns.com/foaf/0.1/knows'
	]

String name static hasMany = [friends:Person] }

The mapped fields can now be referenced in views. Add a DOCTYPE declaration

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">

and start using rdfa tags.

<rdfa:ul about="${person}">
	<g:each var="friend" in="${person.friends}">
		<rdfa:li rel="friends" resource="${friend}" property="name" />
	</g:each>
</rdfa:ul>

Finally, the following XHTML+RDFa will be rendered:

<ul about="http://example.com/person/resource/1" typeof="ns1:Person" xmlns:ns1="http://xmlns.com/foaf/0.1/">
	<li rel="ns1:knows" resource="http://example.com/person/resource/2" property="ns1:name">
		John Doe II
	</li>
	<li rel="ns1:knows" resource="http://example.com/person/resource/3" property="ns1:name">
		John Doe III
	</li>
</ul>

Controller mapping

It is important to distinguish between the thing you're describing (the domain model object), and its description (the view rendered by a controller action). E.g., a Person in a domain model can have a name, whereas a document describing this person cannot, but can have other information such as creation date or terms of use. Hence, the controller needs an additional action for identifying domain objects, and the relation of controller actions to the domain model objects need to be specified.

class PersonController {
	static rdf = [
		resource: { it.id },	// name of identifying action and identity field of domain model object
		image:'http://xmlns.com/foaf/0.1/depiction',
		show:'http://xmlns.com/foaf/0.1/isPrimaryTopicOf'
	]

def show = { [person:Person.get(params.id)] }

def resource = { redirect(action:show,id:params.id) }

def image = { redirect(uri:"/images/default-avatar.png") } }

The mapped actions can now be referenced in views.

<rdfa:p about="${person}">
	<rdfa:img rel="image" alt="depiction of ${person.name}" />
</rdfa:p>

The following XHTML+RDFa will be rendered:

<p about="http://example.com/person/resource/1" typeof="ns1:Person" xmlns:ns1="http://xmlns.com/foaf/0.1/">
	<img rel="ns1:depiction" src="http://example.com/person/image/1" alt="depiction of John Doe I" >
</p>

Consuming Linked Data

You can also expose RDFa of other objects than just mapped domain model objects. Using the enclosed object triple mapping implementation, you can add resources from other datasets as well and reference them in views.

GraphService graphService
def berlin = graphService.get("http://dbpedia.org/resource/Berlin", vocab.dbpedia.City)

TODO

  • beautiful XML namespace declarations (e.g., "foaf" instead of "ns1")
  • automatically guess, e.g., rel="friends" from <g:each in="${person.friends}">...</g:each>
  • Make better use of existing URLMapping (do not require ID closure in controller)

Team

Last updated by admin 2 years ago
Last updated by admin 2 years ago