Skip to main content
Aligning
Web Services
with the
Semantic Web
to Create a
Global Read-Write
Graph of Data

Markus Lanthaler
Graz University of Technology
Web services are increasingly popular
Twitter      Facebook     Google
15 billion    5 billion   5 billion
 per day      per day     per day
Semantic Web is still in its infancy
Semaphobia!?
Lightweight semantic annotations
     start to gain acceptance
Increasing interest in the relationship of
   RESTful services and Linked Data
Increasing interest in the relationship of
   RESTful services and Linked Data
© Nesster




            Most previous efforts assume
            RPC-style. REST is different.
simplicity


         son
{
    "id": 556410,
    "first_name": "Markus",
    "last_name": "Lanthaler",
    "gender": "male",
    "knows": [
      { "id": 586807, "name": "Christian Gütl" },
      { "id": 790980, "name": "John Doe" } ]
}
{
    "id": 556410,
    "first_name": "Markus",
    "last_name": "Lanthaler",
    "gender": "male",
    "knows": [
      { "id": 586807, "name": "Christian Gütl" },
      { "id": 790980, "name": "John Doe" } ]
}




    "type": "object",
    "model": "[foaf:Person]",
    "properties": {
      "id": {
        "type": "number", "model": "[ex:id]" },
      "first_name": {
        "type": "string", "model": "[foaf:firstName]" },
      "last_name": {
        "type": "string", "model": "[foaf:surname]" },
      ...
{
    "id": 556410,
    "first_name": "Markus",
    "last_name": "Lanthaler",
    "gender": "male",
    "knows": [
      { "id": 586807, "name": "Christian Gütl" },
      { "id": 790980, "name": "John Doe" } ]
}




    "type": "object",
    "model": "[foaf:Person]",
    "properties": {
      "id": {
        "type": "number", "model": "[ex:id]" },
      "first_name": {
        "type": "string", "model": "[foaf:firstName]" },
      "last_name": {
        "type": "string", "model": "[foaf:surname]" },
      ...
{
    "id": 556410,
    "first_name": "Markus",
    "last_name": "Lanthaler",
    "gender": "male",
    "knows": [
      { "id": 586807, "name": "Christian Gütl" },
      { "id": 790980, "name": "John Doe" } ]
}




    "type": "object",
    "model": "[foaf:Person]",
    "properties": {
      "id": {
        "type": "number", "model": "[ex:id]" },
      "first_name": {
        "type": "string", "model": "[foaf:firstName]" },
      "last_name": {
        "type": "string", "model": "[foaf:surname]" },
      ...
{
    "id": 556410,
    "first_name": "Markus",
    "last_name": "Lanthaler",
    "gender": "male",
    "knows": [
      { "id": 586807, "name": "Christian Gütl" },
      { "id": 790980, "name": "John Doe" } ]
}




          "/user/{id}": {
            "mediaType": "application/json",
            "seredasjDescription": "#",
            "variables": {
              "id": {
                 "binding": "#properties/knows/id"
            } },
            "requestDescription": "#"
          }
      }
{
    "id": 556410,
    "first_name": "Markus",
    "last_name": "Lanthaler",
    "gender": "male",
    "knows": [
      { "id": 586807, "name": "Christian Gütl" },
      { "id": 790980, "name": "John Doe" } ]
}




      "links": {
        "/user/search{?query}": {
           "mediaType": "application/json",
           "seredasjDescription": "personlist.json",
           "semantics": {
             "[iana:relation]": "[iana:search]" },
           "variables": {
             "query": { "model": "[foaf:name]" }
           }
        },
{
    "id": 556410,
    "first_name": "Markus",
    "last_name": "Lanthaler",
    "gender": "male",
    "knows": [
      { "id": 586807, "name": "Christian Gütl" },
      { "id": 790980, "name": "John Doe" } ]
}
Two Algorithms
1   select ← createSelect(query)
 2   bindings ← tripleStore.execute(select)
 3
 4   for each binding in bindings do
 5     deleteData ← createDeleteData(query, binding)
 6     operations.add(deleteData)
 7     insertData ← insertDeleteData(query, binding)
 8     operations.add(insertData)
 9   end for
10
11   operations.sort()
12   translateDataOperations(operations)
1   do
 2     requests ← retrievePotentialRequests(triples)
 3     progress ← false
 4     while requests.hasNext() = true do
 5       request ← requests.next()
 6       request.setData(triples)
 7       request.setData(tripleStore)
 8       if isValid(request) = true then
 9         if request.submit() = success then
10           resp ← request.parseResponse()
11           triples.update(resp.getTriples())
12           tripleStore.update(resp.getTriples())
13           requests.remove(request)
14           progress ← true
15         end if
16       end if
17     end while
18   while progress = true
19   if triples.empty() = true then
20     success()
21   else
22     error(triples)
23   end if
Publication Management Service
/author/{id}                   /publication/{id}
            foaf:Person                     foaf:Document
id           ex:persId             id            ex:pubId
name         foaf:givenName    X   title         dc:title      X
lastname     foaf:familyName   X   authors[] dc:creator        X
address      v:adr                      id       ex:persId     X
     city    v:locality                 name foaf:name
     country v:country-name
1   INSERT DATA {
 2     _:public1 a foaf:Document ;
 3               dc:title "My first paper" ;
 4               dc:creator _:author1 ;
 5               dc:creator auth:cg789 .
 6     _:author1 a foaf:Person ;
 7               foaf:givenName "Markus" ;
 8               foaf:familyName "Lanthaler" ;
 9               v:adr _:addr1 .
10     _:addr1 v:country-name "Italy" .
11   }



POST /publication/               POST /author/
  { "title": "My first paper",
    "authors": [
      { "id": "cg789" }
    ]
  }

201 Created
Location: /publication/p489/
1   INSERT DATA {
 2     _:public1 a foaf:Document ;
 3     pub:p489 dc:title "My first paper" ;
 4               dc:creator _:author1 ;
 5               dc:creator auth:cg789 .
 6     _:author1 a foaf:Person ;
 7     auth:ml98 foaf:givenName "Markus" ;
 8               foaf:familyName "Lanthaler" ;
 9               v:adr _:addr1 .
10     _:addr1 v:country-name "Italy" .
11   }



POST /publication/               POST /author/
  { "title": "My first paper",     { "name": "Markus",
    "authors": [                     "lastname": "Lanthaler",
      { "id": "cg789" }              "address": {
    ]                                  "country": "Italy"
  }                                } }

201 Created                      201 Created
Location: /publication/p489/     Location: /author/ml98
1   INSERT DATA {
 2     _:public1 a foaf:Document ;
 3     pub:p489 dc:title "My first paper" ;
 4               dc:creator auth:ml98 ;
 5               dc:creator auth:cg789 .
 6     _:author1 a foaf:Person ;
 7     auth:ml98 foaf:givenName "Markus" ;
 8               foaf:familyName "Lanthaler" ;
 9               v:adr _:addr1 .
10     _:addr1 v:country-name "Italy" .
11   }



PUT /publication/p489
  { "title": "My first paper",
    "authors": [
      { "id": "cg789" },
      { "id“: "ml98" }
    ]
  }

200 OK
do it on-the-fly
Thank You



© 2011, Markus Lanthaler. Some Rights Reserved.
http://creativecommons.org/licenses/by-nc-sa/3.0/
Questions?




Markus Lanthaler                     @MarkusLanthaler
Markus.Lanthaler@student.TUGraz.at   http://www.slideshare.net/lanthaler
Image Credits
(1) http://galleries.www.frut.lv/en/5432/959
(3) Adapted from “Two Billion is Cool,” M. Thomson. Available:
    http://corp.klout.com/blog/2011/07/two-billion-is-cool/
(5) http://en.wikipedia.org/wiki/The_Scream
(9) http://www.flickr.com/photos/nesster/3168425434/