du00cs / sparql-template

RDF store traversal with Jena API via automatic mapping between POJO and SPARQL.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SPARQL Template

Build status

Small library for traversing an RDF store using automatic mapping of triples to annotated POJOs.

Highlights

  • Support of any store exposing HTTP SPARQL endpoint
  • Uses Jena API to load and process RDF triples
  • Uses MappingContext from Spring Data Commons to process class annotations
  • On-demand (lazy) loading of relations using automatic proxying with ByteBuddy
  • Easily extended for conversion from any org.apache.jena.graph.Node to a custom Java type
  • Some useful converters are registered by default, see ch.unil.sparql.template.convert.ExtendedRdfJavaConverter
  • java.util.Date
  • java.time.ZonedDateTime
  • java.time.Duration
  • java.net.URL

Examples

Assume we want to retrieve some information about a person from the DBPedia using the SPARQL endpoint. We annotate our domain POJO as following.

// marks this as an RDF entity
@Rdf
public class Person {

    // will be mapped from the value of http://dbpedia.org/ontology/birthName
    @Predicate(DBP_NS)
    private String birthName;

    // will be mapped from the value of http://www.w3.org/2000/01/rdf-schema#label for the Russian language
    @Predicate(value = RDFS_NS, language = "ru")
    private String label;

    // will be mapped from the value of http://dbpedia.org/property/birthDate, automatic conversion to java.time.ZonedDateTime
    @Predicate(DBP_NS)
    private ZonedDateTime birthDate;

    // will be mapped from the values of http://dbpedia.org/property/spouse, lazy load of relationships
    @Predicate(DBP_NS)
    @Relation
    private Collection<Person> spouse;
}

Then we can just use ch.unil.sparql.template.SparqlTemplate to load the triples from the DBPedia converting them automatically to the required Java instance.

    // get the default SPARQL template
    final SparqlTemplate sparqlTemplate = new SparqlTemplate("https://dbpedia.org/sparql");

    // load information about Angelina Jolie
    final Person person = sparqlTemplate.load(DBR_NS + "Angelina_Jolie", Person.class);

    System.out.println(person.getBirthName());
    // Angelina Jolie Voight

    System.out.println(person.getLabel());
    // Джоли, Анджелина

    System.out.println(person.getBirthDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy (EEE)", Locale.ENGLISH)));
    // 04/06/1975 (Wed)

    System.out.println(person.getSpouse().stream()
            .filter(p -> p.getBirthName() != null && p.getBirthName().contains("Pitt"))
            .findAny().get().getBirthName());
    // William Bradley Pitt

About

RDF store traversal with Jena API via automatic mapping between POJO and SPARQL.


Languages

Language:Java 100.0%