#!/usr/bin/perl use strict; use warnings; use RDF::Query; ### helper functions sub hash_to_string { my %results_row = @_; my $str = join('|', %results_row); %results_row = (); return $str; } sub string_to_hash { my $str = shift; my @vals = split(/\|/, $str); my %results_row; for (my $i = 0; $i < $#vals; $i += 2) { $results_row{$vals[$i]} = $vals[$i + 1]; } return %results_row; } sub execute_query { #my $select_clause = shift; my $where_clause = shift; #my $order_by_clause = shift; my $filename = shift; print "running query...\n"; my $start_time = time(); my $sparql = <<"END"; PREFIX rdf: PREFIX rdfs: PREFIX relation: SELECT * FROM WHERE { END $sparql .= $where_clause; $sparql .= "}"; my $query = RDF::Query->new( $sparql, undef, undef, 'sparql' ); my $stream = $query->execute(); open (RESULTS_FILE, ">query-results/$filename"); while (my $data = $stream->()) { my @values = map { $query->bridge->as_string( $_ ) } @$data; my @keys = $stream->binding_names; my %values; @values{ @keys } = @values; print RESULTS_FILE &hash_to_string(%values) . "\n"; %values = (); } $query = 0; close (RESULTS_FILE); my $end_time = time(); print "took " . ($end_time - $start_time) . " seconds.\n"; #foreach my $row (@rows) { # print RESULTS_FILE "$row\n"; #} } ### MAIN my $where_clause; ### Create results files with data on topics, authors, etc. $where_clause = <<"END"; ?item relation:Addresses_topic ?topic END &execute_query($where_clause, "topic"); $where_clause = <<"END"; ?item relation:Is_for ?position END &execute_query($where_clause, "is_for"); $where_clause = <<"END"; ?item relation:Is_against ?position END &execute_query($where_clause, "is_against"); $where_clause = <<"END"; ?item relation:Is_mixed_on ?position END &execute_query($where_clause, "is_mixed"); $where_clause = <<"END"; ?item relation:Was_written_by ?author END &execute_query($where_clause, "author");