The Graph To Graph Mapping Language (G2GML) is a language for mapping RDF graphs to property graphs.
- The mapping is described with a combination of RDF graph patterns and property graph patterns.
- RDF graph patterns are written in WHERE clause syntax of SPARQL, while the property graph patterns are written in MATCH clause syntax of Cypher.
Structure of G2GML
<prefixes>
<property graph patterns> <-- Cypher MATCH clause syntax
<semantic graph patterns> <-- SPARQL WHERE clause syntax
...
- RDF resource > PG node
- RDF datatype property > PG node property
- RDF object property > PG edge
Input: mini-01.ttl
@prefix : <http://example.org/> .
:person1 a :Person .
Mapping: mini-01.g2g
PREFIX : <http://example.org/>
(p:person) <-- PG node is defined
?p a :Person .
Output: mini-01.pg
"http://example.org/person1" :person
Input: mini-02.ttl
@prefix : <http://example.org/> .
:person1 a :Person .
:person1 :age 30 .
Mapping: mini-02.g2g
PREFIX : <http://example.org/>
(p:person {age:a}) <-- PG node property is defined
?p a :Person .
?p :age ?a .
Output: mini-02.pg
"http://example.org/person1" :person age:30
Input: mini-03.ttl
@prefix : <http://example.org/> .
:person1 a :Person .
:person2 a :Person .
:person1 :follows :person2 .
Mapping: mini-03.g2g
PREFIX : <http://example.org/>
(p:person)
?p a :Person .
(p1:person)-[:follows]->(p2:person) <-- PG edge is defined
?p1 :follows ?p2 .
Output: mini-03.pg
"http://example.org/person1" :person
"http://example.org/person2" :person
"http://example.org/person1" -> "http://example.org/person2" :follows
Input: mini-04.ttl
@prefix : <http://example.org/> .
:person1 a :Person .
:person2 a :Person .
[] a :Follow ;
:follower :person1 ;
:followed :person2 .
Mapping: mini-04.g2g
PREFIX : <http://example.org/>
(p:person)
?p a :Person .
(p1:person)-[:follows]->(p2:person) <-- PG edge is defined
?f :follower ?p1 ;
:followed ?p2 .
Output: mini-04.pg
"http://example.org/person1" :person
"http://example.org/person2" :person
"http://example.org/person1" "http://example.org/person2" :follows
Input: mini-05.ttl
@prefix : <http://example.org/> .
:person1 a :Person .
:person2 a :Person .
[] a :Follow ;
:follower :person1 ;
:followed :person2 ;
:since 2017 .
Mapping: mini-05.g2g
PREFIX : <http://example.org/>
(p:person)
?p a :Person .
(p1:person)-[:follows {since:s}]->(p2:person) <-- PG edge is defined
?f :follower ?p1 ;
:followed ?p2 ;
:since ?s .
Output: mini-05.pg
"http://example.org/person1" :person
"http://example.org/person2" :person
"http://example.org/person1" "http://example.org/person2" :follows since:2017
musician.g2g
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX dbpedia-prop: <http://dbpedia.org/property/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
# Node mappings
(mus:musician {vis_label:nam, born:dat, hometown:twn, page_length:len})
?mus rdf:type foaf:Person, dbpedia-owl:MusicalArtist .
?mus rdfs:label ?nam .
FILTER(lang(?nam) = "en") .
OPTIONAL { ?mus dbpedia-prop:born ?dat }
OPTIONAL { ?mus dbpedia-owl:hometown / rdfs:label ?twn. FILTER(lang(?twn) = "en"). }
OPTIONAL { ?mus dbpedia-owl:wikiPageLength ?len }
# Edge mappings
(mus1:musician)-[:same_group {label:nam, hometown:twn, page_length:len}]->(mus2:musician)
?grp a schema:MusicGroup.
{ ?grp dbpedia-owl:bandMember ?mus1 , ?mus2. } UNION
{ ?grp dbpedia-owl:formerBandMember ?mus1 , ?mus2. }
FILTER(?mus1 != ?mus2)
OPTIONAL { ?grp rdfs:label ?nam. FILTER(lang(?nam) = "en")}
OPTIONAL { ?grp dbpedia-owl:hometown / rdfs:label ?twn. FILTER(lang(?twn) = "en"). }
OPTIONAL { ?grp dbpedia-owl:wikiPageLength ?len }
(mus1:musician)-[:influenced]->(mus2:musician)
?mus1 dbpedia-owl:influenced ?mus2 .