Presentation of the paper "Aligning Web Services with the Semantic Web to Create a Global Read-Write Graph of Data" gave at the 9th IEEE European Conference on Web Services (ECOWS 2011) in Lugano, Switzerland.
Despite significant research and development efforts, the vision of the Semantic Web yielding to a Web of Data has not yet become reality. Even though initiatives such as Linking Open Data gained traction recently, the Web of Data is still clearly outpaced by the growth of the traditional, document-based Web. Instead of releasing data in the form of RDF, many publishers choose to publish their data in the form of Web services. The reasons for this are manifold. Given that RESTful Web services closely resemble the document-based Web, they are not only perceived as less complex and disruptive, but also provide read-write interfaces to the underlying data. In contrast, the current Semantic Web is essentially read-only which clearly inhibits net-working effects and engagement of the crowd. On the other hand, the prevalent use of proprietary schemas to represent the data published by Web services inhibits generic browsers or crawlers to access and understand this data; the consequence are islands of data instead of a global graph of data forming the envisioned Semantic Web. We thus propose a novel approach to integrate Web services into the Web of Data by introducing an algorithm to translate SPARQL queries to HTTP requests. The aim is to create a global read-write graph of data and to standardize the mashup development process. We try to keep the approach as familiar and simple as possible to lower the entry barrier and foster the adoption of our approach. Thus, we based our proposal on SEREDASj, a semantic description language for RESTful data services, for making proprietary JSON service schemas accessible.
19. 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)
20. 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
22. /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
23. 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/
24. 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
25. 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