hypermedia-driven Web query solving

Ruben Verborgh <[email protected]> Tue, 11 Mar 2014 16:56:22 +0000
Newsgroups gmane.comp.web.services.rest
Message-ID <[email protected]>
--z77uQFv9LS-kHbdHjovohuyu-hvxrJ7YFOTQJIe
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable

Hi hypermedia/REST people,

You might like our latest hypermedia client implementation.
It solves queries over Linked Data by using hypermedia:
http://client.linkeddatafragments.org/
(Web version of https://github.com/LinkedDataFragments/Client).

A server offers basic Linked Data Fragments (http://linkeddatafragments.org=
/);
they are pieces of a dataset, together with metadata and controls.
The collection of fragments forms a hypermedia API.

The client is given a SPARQL query and one fragment of the dataset.
For instance, we start from the fragment
http://data.linkeddatafragments.org/dbpedia?object=3Ddbpedia%3ABarack_Obama
and the query:
    SELECT ?p, ?c WHERE {
        ?p a <http://dbpedia.org/ontology/Artist>.
        ?p <http://dbpedia.org/ontology/birthPlace> ?c.
        ?c <http://xmlns.com/foaf/0.1/name> "York"@en.
    }
As you can see when you open the fragment in your browser,
there is a form that allows to retrieve triple fragments.
So for each of the 3 triple patterns in the above query,
corresponding fragments are retrieved through the form.
The fragment with the smallest resultset is used to solve subqueries.
This process is then repeated to solve the entire query;
all while following hypermedia controls at each step.
You can see this hypermedia step happen here:
https://github.com/LinkedDataFragments/Client/blob/85b67be35/lib/LinkedData=
FragmentsClient.js#L33

Have a look at the high-level algorithm here:
http://ruben.verborgh.org/blog/2014/03/11/towards-web-scale-web-querying/#q=
uerying-with-linked-data-fragments
Detailed algorithm:
http://linkeddatafragments.org/publications/ldow2014.pdf#page=3D5

Hypermedia is crucial for this type of querying,
because we want to be able to query any type of server
without requiring out-of-band knowledge.
Additionally, we don't want to assume that one server has all fragments,
so links on a fragment can target fragments on other servers as well.

The hypermedia formats supported by our server are HTML+RDFa / Turtle / JSO=
N-LD.
The client supports HTML+RDFa and Turtle.
We use the Hydra vocabulary (http://www.w3.org/community/hydra/) to express=
 the hypermedia controls in RDF.
The use of Hydra should enable other hypermedia-driven clients to consume f=
ragments as well.
More details on our use of Hydra here: http://lists.w3.org/Archives/Public/=
public-hydra/2014Mar/0051.html

Looking forward to your feedback, and I'm available for comments and questi=
ons.

Best,

Ruben
--z77uQFv9LS-kHbdHjovohuyu-hvxrJ7YFOTQJIe
Content-Type: text/html; charset=US-ASCII
Content-Transfer-Encoding: 7bit




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
</head>






 
<body style="background-color: #fff;">
<span style="display:none">&nbsp;</span>

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="position:relative;">
  <div id="ygrp-msg" style="z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id="ygrp-text" >
      
      
      <p>Hi hypermedia/REST people,<br>
<br>
You might like our latest hypermedia client implementation.<br>
It solves queries over Linked Data by using hypermedia:<br>
http://client.linkeddatafragments.org/<br>
(Web version of https://github.com/LinkedDataFragments/Client).<br>
<br>
A server offers basic Linked Data Fragments (http://linkeddatafragments.org/);<br>
they are pieces of a dataset, together with metadata and controls.<br>
The collection of fragments forms a hypermedia API.<br>
<br>
The client is given a SPARQL query and one fragment of the dataset.<br>
For instance, we start from the fragment<br>
http://data.linkeddatafragments.org/dbpedia?object=dbpedia%3ABarack_Obama<br>
and the query:<br>
    SELECT ?p, ?c WHERE {<br>
        ?p a &lt;http://dbpedia.org/ontology/Artist&gt;.<br>
        ?p &lt;http://dbpedia.org/ontology/birthPlace&gt; ?c.<br>
        ?c &lt;http://xmlns.com/foaf/0.1/name&gt; &quot;York&quot;@en.<br>
    }<br>
As you can see when you open the fragment in your browser,<br>
there is a form that allows to retrieve triple fragments.<br>
So for each of the 3 triple patterns in the above query,<br>
corresponding fragments are retrieved through the form.<br>
The fragment with the smallest resultset is used to solve subqueries.<br>
This process is then repeated to solve the entire query;<br>
all while following hypermedia controls at each step.<br>
You can see this hypermedia step happen here:<br>
https://github.com/LinkedDataFragments/Client/blob/85b67be35/lib/LinkedDataFragmentsClient.js#L33<br>
<br>
Have a look at the high-level algorithm here:<br>
http://ruben.verborgh.org/blog/2014/03/11/towards-web-scale-web-querying/#querying-with-linked-data-fragments<br>
Detailed algorithm:<br>
http://linkeddatafragments.org/publications/ldow2014.pdf#page=5<br>
<br>
Hypermedia is crucial for this type of querying,<br>
because we want to be able to query any type of server<br>
without requiring out-of-band knowledge.<br>
Additionally, we don&#39;t want to assume that one server has all fragments,<br>
so links on a fragment can target fragments on other servers as well.<br>
<br>
The hypermedia formats supported by our server are HTML&#43;RDFa / Turtle / JSON-LD.<br>
The client supports HTML&#43;RDFa and Turtle.<br>
We use the Hydra vocabulary (http://www.w3.org/community/hydra/) to express the hypermedia controls in RDF.<br>
The use of Hydra should enable other hypermedia-driven clients to consume fragments as well.<br>
More details on our use of Hydra here: http://lists.w3.org/Archives/Public/public-hydra/2014Mar/0051.html<br>
<br>
Looking forward to your feedback, and I&#39;m available for comments and questions.<br>
<br>
Best,<br>
<br>
Ruben</p>

    </div>
     

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <div style="color: #fff; height: 0;">__._,_.___</div>

          
  
    
    <div style="clear:both"> </div>

    <table cellspacing=4px style="margin-top: 20px; margin-bottom: 10px;">
      <tbody>
        <tr>
          <td style="font-size: 12px; font-family: arial; font-weight: bold; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA "  >
                          <a style="text-decoration: none; color: #2D50FD" href="https://groups.yahoo.com/group/rest-discuss/post;_ylc=X3oDMTJxODllZDNmBF9TAzk3MzU5NzE0BGdycElkAzQzMTkyNTUEZ3Jwc3BJZAMxNzA1NzAxMDE0BG1zZ0lkAzE5NjMzBHNlYwNmdHIEc2xrA3JwbHkEc3RpbWUDMTM5NDU1Njk5MA--?act=reply&messageNum=19633">Reply via web post</a>
                      </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; " >
            <a href="mailto:[email protected]?subject=Re%3A%20hypermedia-driven%20Web%20query%20solving" style="text-decoration: none; color: #2D50FD;">
              Reply to sender            </a> 
          </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; ">
            <a href="mailto:[email protected]?subject=Re%3A%20hypermedia-driven%20Web%20query%20solving" style="text-decoration: none; color: #2D50FD">
              Reply to group            </a> 
          </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; " >
            <a href="https://groups.yahoo.com/group/rest-discuss/post;_ylc=X3oDMTJlZDMxOTl0BF9TAzk3MzU5NzE0BGdycElkAzQzMTkyNTUEZ3Jwc3BJZAMxNzA1NzAxMDE0BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTM5NDU1Njk5MA--" style="text-decoration: none; color: #2D50FD">Start a New Topic</a>
          </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #2D50FD; background-color: #F2F2F2; border: 1px solid #EAEAEA; " >
                            <a href="https://groups.yahoo.com/group/rest-discuss/message/19633;_ylc=X3oDMTM2anVsYTZlBF9TAzk3MzU5NzE0BGdycElkAzQzMTkyNTUEZ3Jwc3BJZAMxNzA1NzAxMDE0BG1zZ0lkAzE5NjMzBHNlYwNmdHIEc2xrA3Z0cGMEc3RpbWUDMTM5NDU1Njk5MAR0cGNJZAMxOTYzMw--" style="text-decoration: none; color: #2D50FD;">Messages in this topic</a>
                (1)
                      </td>
        </tr>
      </tbody>
    </table>

        
<!------- Start Nav Bar ------>




 

<!-- |**|begin egp html banner|**| -->
<div id="ygrp-vital" style="background-color: #f2f2f2; font-family: Verdana; font-size: 10px; margin-bottom: 10px; padding: 10px;">

    <span id="vithd" style="font-weight: bold; color: #333; text-transform: uppercase; "><a href="https://groups.yahoo.com/group/rest-discuss;_ylc=X3oDMTJlbWJzcWN0BF9TAzk3MzU5NzE0BGdycElkAzQzMTkyNTUEZ3Jwc3BJZAMxNzA1NzAxMDE0BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTM5NDU1Njk5MA--" style="text-decoration: none;">Visit Your Group</a></span>

     <ul style="list-style-type: none; margin: 0; padding: 0; display: inline;">
            <li style="border-right: 1px solid #000; font-weight: 700; display: inline; padding: 0 5px; margin-left: 0;">
      <span class="cat"><a href="https://groups.yahoo.com/group/rest-discuss/members;_ylc=X3oDMTJmOWFnbXNpBF9TAzk3MzU5NzE0BGdycElkAzQzMTkyNTUEZ3Jwc3BJZAMxNzA1NzAxMDE0BHNlYwN2dGwEc2xrA3ZtYnJzBHN0aW1lAzEzOTQ1NTY5OTA-?o=6" style="text-decoration: none;">New Members</a></span>
      <span class="ct" style="color: #ff7900;">3</span>
    </li>
                                              </ul>
  </div>


<div id="ft" style="font-family: Arial; font-size: 11px; margin-top: 5px; padding: 0 2px 0 0; clear: both;">
  <a href="https://groups.yahoo.com/;_ylc=X3oDMTJkOWVhbHA0BF9TAzk3MzU5NzE0BGdycElkAzQzMTkyNTUEZ3Jwc3BJZAMxNzA1NzAxMDE0BHNlYwNmdHIEc2xrA2dmcARzdGltZQMxMzk0NTU2OTkw" style="float: left;"><img src="http://l.yimg.com/ru/static/images/yg/img/email/new_logo/logo-groups-137x15.png" height="15" width="137" alt="Yahoo! Groups" style="border: 0;"/></a>
  <div style="color: #747575; float: right;"> &bull; <a href="https://info.yahoo.com/privacy/us/yahoo/groups/details.html" style="text-decoration: none;">Privacy</a> &bull; <a href="mailto:[email protected]?subject=Unsubscribe" style="text-decoration: none;">Unsubscribe</a> &bull; <a href="https://info.yahoo.com/legal/us/yahoo/utos/terms/" style="text-decoration: none;">Terms of Use</a> </div>
</div>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

 
  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id="ygrp-sponsor" style="width:160px; float:right; clear:none; margin:0 0 25px 0; background: #fff;">

<!-- Start Recommendations -->
<div id="ygrp-reco">
     </div>
<!-- End Recommendations -->



  </div>   <!-- |**|end egp html banner|**| -->

  <div style="clear:both; color: #FFF; font-size:1px;">.</div>
</div>

  <img src="http://geo.yahoo.com/serv?s=97359714/grpId=4319255/grpspId=1705701014/msgId=19633/stime=1394556990" width="1" height="1"> <br>

<div style="color: #fff; height: 0;">__,_._,___</div>
<!--~-|**|PrettyHtmlEnd|**|-~-->

</body>

<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
  <style type="text/css">
  <!--
  #ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad p {
  margin: 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
  #ygrp-sponsor #ygrp-lc {
  font-family: Arial;
}

#ygrp-sponsor #ygrp-lc #hd {
  margin: 10px 0px;
  font-weight: 700;
  font-size: 78%;
  line-height: 122%;
}

#ygrp-sponsor #ygrp-lc .ad {
  margin-bottom: 10px;
  padding: 0 0;
}

  #actions {
    font-family: Verdana;
    font-size: 11px;
    padding: 10px 0;
  }

  #activity {
    background-color: #e0ecee;
    float: left;
    font-family: Verdana;
    font-size: 10px;
    padding: 10px;
  }

  #activity span {
    font-weight: 700;
  }

  #activity span:first-child {
    text-transform: uppercase;
  }

  #activity span a {
    color: #5085b6;
    text-decoration: none;
  }

  #activity span span {
    color: #ff7900;
  }

  #activity span .underline {
    text-decoration: underline;
  }

  .attach {
    clear: both;
    display: table;
    font-family: Arial;
    font-size: 12px;
    padding: 10px 0;
    width: 400px;
  }

  .attach div a {
    text-decoration: none;
  }

  .attach img {
    border: none;
    padding-right: 5px;
  }

  .attach label {
    display: block;
    margin-bottom: 5px;
  }

  .attach label a {
    text-decoration: none;
  }
  
  blockquote {
    margin: 0 0 0 4px;
  }

  .bold {
    font-family: Arial;
    font-size: 13px;
    font-weight: 700;
  }

  .bold a {
    text-decoration: none;
  }

  dd.last p a {
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span {
    margin-right: 10px;
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span.yshortcuts {
    margin-right: 0;
  }

  div.attach-table div div a {
    text-decoration: none;
  }

  div.attach-table {
    width: 400px;
  }

  div.file-title a, div.file-title a:active, div.file-title a:hover, div.file-title a:visited {
    text-decoration: none;
  }

  div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div.photo-title a:visited {
    text-decoration: none;
  }

  div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
    font-family: Verdana;
    font-size: 10px;
    font-weight: normal;
  }

  .green {
    color: #628c2a;
  }

  .MsoNormal {
    margin: 0 0 0 0;
  }

  o {
    font-size: 0;
  }

  #photos div {
    float: left;
    width: 72px;
  }

  #photos div div {
    border: 1px solid #666666;
    height: 62px;
    overflow: hidden;
    width: 62px;
  }

  #photos div label {
    color: #666666;
    font-size: 10px;
    overflow: hidden;
    text-align: center;
    white-space: nowrap;
    width: 64px;
  }

  #reco-category {
    font-size: 77%;
  }

  #reco-desc {
    font-size: 77%;
  }

  .replbq {
    margin: 4px;
  }

  #ygrp-actbar div a:first-child {
   /* border-right: 0px solid #000;*/
    margin-right: 2px;
    padding-right: 5px;
  }

  #ygrp-mlmsg {
    font-size: 13px;
    font-family: Arial, helvetica,clean, sans-serif;
    *font-size: small;
    *font: x-small;
  }

  #ygrp-mlmsg table {
    font-size: inherit;
    font: 100%;
  }

  #ygrp-mlmsg select, input, textarea {
    font: 99% Arial, Helvetica, clean, sans-serif;
  }

  #ygrp-mlmsg pre, code {
    font:115% monospace;
    *font-size:100%;
  }

  #ygrp-mlmsg * {
    line-height: 1.22em;
  }

  #ygrp-mlmsg #logo {
    padding-bottom: 10px;
  }


  #ygrp-msg p a {
    font-family: Verdana;
  }

  #ygrp-msg p#attach-count span {
    color: #1E66AE;
    font-weight: 700;
  }

  #ygrp-reco #reco-head {
    color: #ff7900;
    font-weight: 700;
  }

  #ygrp-reco {
    margin-bottom: 20px;
    padding: 0px;
  }

  #ygrp-sponsor #ov li a {
    font-size: 130%;
    text-decoration: none;
  }

  #ygrp-sponsor #ov li {
    font-size: 77%;
    list-style-type: square;
    padding: 6px 0;
  } 

  #ygrp-sponsor #ov ul {
    margin: 0;
    padding: 0 0 0 8px;
  }

  #ygrp-text {
    font-family: Georgia;
  }

  #ygrp-text p {
    margin: 0 0 1em 0;
  }

  #ygrp-text tt {
    font-size: 120%;
  }

  #ygrp-vital ul li:last-child {
    border-right: none !important; 
  } 
  -->
  </style>
</head>

<!--~-|**|PrettyHtmlEnd|**|-~-->
</html>
<!-- end group email -->


--z77uQFv9LS-kHbdHjovohuyu-hvxrJ7YFOTQJIe--