#!/usr/bin/perl use strict; use warnings; use LWP::Simple; use RDF::Redland; my $url = $ARGV[0] || die "Usage: $0 \n\n"; my $html = get($url) || die "Whoops! Couldn't get $url, $!"; # place to store all our ping data my @trackback_data; # use a regex to get data out of html while ($html =~ /(<\s*rdf:RDF.*?<\s*\/rdf:RDF\s*>)/sg) { my $rdf = $1; my $storage = RDF::Redland::Storage->new("memory") || die "unable to create storage"; my $model = RDF::Redland::Model->new($storage, "") || die "unable to create model"; my $base_uri = RDF::Redland::URI->new($url); my $parser = RDF::Redland::Parser->new("rdfxml", "application/rdf+xml"); my $stream; # some data might be corrupt so we use an eval block in case the # parser chokes on it eval { $stream = $parser->parse_string_as_stream($rdf, $base_uri); }; ## If the parser chokes we still want the next bit of RDF if ($@) { print $@; next; } while (!$stream->end) { $model->add_statement($stream->current); $stream->next; } ## The RDQL query - a condition of a trackback graph is that the ## subject should be the same as the Dublin Core identifier object my $string = < trackback for RDQL my $query = RDF::Redland::Query->new($string); my $results = $model->query_execute($query); my %graph; while (!$results->finished) { for (my $i=0; $i < $results->bindings_count(); $i++) { my $name=$results->binding_name($i); my $value=$results->binding_value($i); $graph{$name} = $value->as_string; } $results->next_result; push @trackback_data, \%graph; } } foreach my $graph (@trackback_data) { while (my ($key, $value) = each %$graph) { print "$key: $value\n"; } print "\n"; } print "Number of trackback ping records: " . @trackback_data . "\n"; exit 0;