Skip to content

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

Notifications You must be signed in to change notification settings

gushakov/sparql-template

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages