AttributesValues
type
Description
  • What? A simple guide usable by any Perl developer seeking to exploit SPARQL without hassles. Why? SPARQL is a powerful query language, results serialization format, and an HTTP based data access protocol from the W3C. It provides a mechanism for accessing and integrating data across Deductive Database Systems (colloquially referred to as triple or quad stores in Semantic Web and Linked Data circles) -- database systems (or data spaces) that manage proposition oriented records in 3-tuple (triples) or 4-tuple (quads) form. How? SPARQL queries are actually HTTP payloads (typically). Thus, using a RESTful client-server interaction pattern, you can dispatch calls to a SPARQL compliant data server and receive a payload for local processing. Steps: Determine which SPARQL endpoint you want to access e.g. DBpedia or a local Virtuoso instance (typically: http://localhost:8890/sparql). If using Virtuoso, and you want to populate its quad store using SPARQL, assign "SPARQL_SPONGE" privileges to user "SPARQL" (this is basic control, more sophisticated WebID based ACLs are available for controlling SPARQL access). Script: # # Demonstrating use of a single query to populate a # Virtuoso Quad Store via Perl. # # # HTTP URL is constructed accordingly with CSV query results format as the default via mime type. # use CGI qw/:standard/; use LWP::UserAgent; use Data::Dumper; use Text::CSV_XS; sub sparqlQuery(@args) { my $query=shift; my $baseURL=shift; my $format=shift; %params=( "default-graph" => "", "should-sponge" => "soft", "query" => $query, "debug" => "on", "timeout" => "", "format" => $format, "save" => "display", "fname" => "" ); @fragments=(); foreach $k (keys %params) { $fragment="$k=".CGI::escape($params{$k}); push(@fragments,$fragment); } $query=join("&", @fragments); $sparqlURL="${baseURL}?$query"; my $ua = LWP::UserAgent->new; $ua->agent("MyApp/0.1 "); my $req = HTTP::Request->new(GET => $sparqlURL); my $res = $ua->request($req); $str=$res->content; $csv = Text::CSV_XS->new(); foreach $line ( split(/^/, $str) ) { $csv->parse($line); @bits=$csv->fields(); push(@rows, [ @bits ] ); } return \@rows; } # Setting Data Source Name (DSN) $dsn="http://dbpedia.org/resource/DBpedia"; # Virtuoso pragmas for instructing SPARQL engine to perform an HTTP GET using the IRI in # FROM clause as Data Source URL en route to DBMS # record Inserts. $query="DEFINE get:soft \"replace\"\n # Generic (non Virtuoso specific SPARQL # Note: this will not add records to the # DBMS SELECT DISTINCT * FROM <$dsn> WHERE {?s ?p ?o}"; $data=sparqlQuery($query, "http://localhost:8890/sparql/", "text/csv"); print "Retrieved data:\n"; print Dumper($data); Output Retrieved data: $VAR1 = [ [ 's', 'p', 'o' ], [ 'http://dbpedia.org/resource/DBpedia', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type', 'http://www.w3.org/2002/07/owl#Thing' ], [ 'http://dbpedia.org/resource/DBpedia', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type', 'http://dbpedia.org/ontology/Work' ], [ 'http://dbpedia.org/resource/DBpedia', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type', 'http://dbpedia.org/class/yago/Software106566077' ], ... Conclusion CSV was chosen over XML (re. output format) since this is about a "no-brainer installation and utilization" guide for a Perl developer that already knows how to use Perl for HTTP based data access within HTML. SPARQL just provides an added bonus to URL dexterity (delivered via URI abstraction) with regards to constructing Data Source Names or Addresses. Related RDF::Query::Client Guide SPARQL Guide for the Perl Developer SPARQL Guide for the PHP Developer SPARQL Guide for the Python Developer SPARQL Guide for the Ruby Developer Simple Guide for using SPARQL with Virtuoso General SPARQL Tutorial Collection Virtuoso Specific SPARQL Tutorial Collection The URI, URL, and Linked Data Meme's Generic HTTP URI.
Creator
  • Kingsley Uyi Idehen
Date
  • 2011-01-25T16:05:17Z
Title
  • SPARQL Guide for the Perl Developer
Link
content:encoded
  • What?

    A simple guide usable by any Perl developer seeking to exploit SPARQL without hassles.

    Why?

    SPARQL is a powerful query language, results serialization format, and an HTTP based data access protocol from the W3C. It provides a mechanism for accessing and integrating data across Deductive Database Systems (colloquially referred to as triple or quad stores in Semantic Web and Linked Data circles) -- database systems (or data spaces) that manage proposition oriented records in 3-tuple (triples) or 4-tuple (quads) form.

    How?

    SPARQL queries are actually HTTP payloads (typically). Thus, using a RESTful client-server interaction pattern, you can dispatch calls to a SPARQL compliant data server and receive a payload for local processing.

    Steps:

    1. Determine which SPARQL endpoint you want to access e.g. DBpedia or a local Virtuoso instance (typically: http://localhost:8890/sparql).
    2. If using Virtuoso, and you want to populate its quad store using SPARQL, assign "SPARQL_SPONGE" privileges to user "SPARQL" (this is basic control, more sophisticated WebID based ACLs are available for controlling SPARQL access).

    Script:

    #
    # Demonstrating use of a single query to populate a 
    # Virtuoso Quad Store via Perl. 
    #
    
    # 
    # HTTP URL is constructed accordingly with CSV query results format as the default via mime type.
    #
    
    use CGI qw/:standard/;
    use LWP::UserAgent;
    use Data::Dumper;
    use Text::CSV_XS;
    
    sub sparqlQuery(@args) {
      my $query=shift;
      my $baseURL=shift;
      my $format=shift;
    	
    	%params=(
    		"default-graph" => "", "should-sponge" => "soft", "query" => $query,
    		"debug" => "on", "timeout" => "", "format" => $format,
    		"save" => "display", "fname" => ""
    	);
    	
    	@fragments=();
    	foreach $k (keys %params) {
    		$fragment="$k=".CGI::escape($params{$k});
    		push(@fragments,$fragment);
    	}
    	$query=join("&", @fragments);
    	
    	$sparqlURL="${baseURL}?$query";
    	
    	my $ua = LWP::UserAgent->new;
    	$ua->agent("MyApp/0.1 ");
    	my $req = HTTP::Request->new(GET => $sparqlURL);
    	my $res = $ua->request($req);
    	$str=$res->content;
    	
    	$csv = Text::CSV_XS->new();
    	
    	foreach $line ( split(/^/, $str) ) {
    		$csv->parse($line);
    		@bits=$csv->fields();
    	  push(@rows, [ @bits ] );
    	}
    	return \@rows;
    }
    
    
    # Setting Data Source Name (DSN)
    
    $dsn="http://dbpedia.org/resource/DBpedia";
    
    # Virtuoso pragmas for instructing SPARQL engine to perform an HTTP GET using the IRI in
    # FROM clause as Data Source URL en route to DBMS
    # record Inserts.
    
    $query="DEFINE get:soft \"replace\"\n
    
    # Generic (non Virtuoso specific SPARQL
    # Note: this will not add records to the 
    # DBMS 
    
    SELECT DISTINCT * FROM <$dsn> WHERE {?s ?p ?o}"; 
    
    $data=sparqlQuery($query, "http://localhost:8890/sparql/", "text/csv");
    
    print "Retrieved data:\n";
    print Dumper($data);
    

    Output

    Retrieved data:
    $VAR1 = [
              [
                's',
                'p',
                'o'
              ],
              [
                'http://dbpedia.org/resource/DBpedia',
                'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',
                'http://www.w3.org/2002/07/owl#Thing'
              ],
              [
                'http://dbpedia.org/resource/DBpedia',
                'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',
                'http://dbpedia.org/ontology/Work'
              ],
              [
                'http://dbpedia.org/resource/DBpedia',
                'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',
                'http://dbpedia.org/class/yago/Software106566077'
              ],
    ...
    

    Conclusion

    CSV was chosen over XML (re. output format) since this is about a "no-brainer installation and utilization" guide for a Perl developer that already knows how to use Perl for HTTP based data access within HTML. SPARQL just provides an added bonus to URL dexterity (delivered via URI abstraction) with regards to constructing Data Source Names or Addresses.

    Related

wfw:comment
wfw:commentRss
is rdf:_12 of
Alternative Linked Data Views: Sponger | iSPARQL | ODE     Raw Data in: CXML | CSV | RDF ( N-Triples N3/Turtle JSON XML ) | OData ( Atom JSON )    About   
This material is Open Knowledge   W3C Semantic Web Technology [RDF Data] This material is Open Knowledge Creative Commons License Valid XHTML + RDFa
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License.
OpenLink Virtuoso version 06.01.3127, on Linux (x86_64-pc-linux-gnu), Standard Edition
Copyright © 2009-2011 OpenLink Software