Mapping RDF triples to LPG concepts - Neptune Analytics

Mapping RDF triples to LPG concepts

There are three rules that define how RDF triples correspond to LPG concepts:

Case RDF triple ⇆ LPG concept ----------------------------------------------------------------- Case #1 { <iri> rdf:type <iri> } ⇆ vertex with id + label Case #2 { <iri> <iri> "literal"} ⇆ vertex property Case #3 { <iri> <iri> <iri> } ⇆ edge with label

Case #1: Vertex with id and label

A triple like:

<http://example.com/Alice> rdf:type <http://xmlns.com/foaf/0.1/Person>

is equivalent to creating the vertex in openCypher like:

CREATE (:`<http://xmlns.com/foaf/0.1/Person>` {`~id`: "<http://example.com/Alice>"})

In this example, the vertex label <http://xmlns.com/foaf/0.1/Person> is interpreted and stored as an IRI.

Note

The back quote syntax `` is part of openCypher which allows inserting characters that normally cannot be used in labels. Using this mechanism, it’s possible to include complete IRIs in a query.

Using PREFIX, the same CREATE query could look like:

PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX ex: <http://example.com/> CREATE (: foaf::Person {`~id`: ex::Alice})

To match the newly created vertex based on its id:

MATCH (v {`~id`: "<http://example.com/Alice>"}) RETURN v

or equivalently:

PREFIX ex: <http://example.com/> MATCH (v {`~id`: ex::Alice}) RETURN v

To find vertices with that RDF Class/LPG Label:

MATCH (v:`<http://xmlns.com/foaf/0.1/Person>`) RETURN v

or equivalently:

PREFIX foaf: <http://xmlns.com/foaf/0.1/> MATCH (v : foaf::Person) RETURN v

Case #2: Vertex property

A triple like:

<http://example.com/Alice> <http://xmlns.com/foaf/0.1/name> "Alice Smith"

is equivalent to defining with openCypher node with a given ~id and property, where both the ~id and the property key are IRIs:

CREATE ({`~id`: "<http://example.com/Alice>", `<http://xmlns.com/foaf/0.1/name>`: "Alice Smith" })

or equivalently:

PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX ex: <http://example.com/> CREATE ({`~id`: ex::Alice, foaf::name: "Alice Smith" })

To match the vertex with that property:

MATCH (v {`<http://xmlns.com/foaf/0.1/name>`: "Alice Smith"}) RETURN v

or equivalently:

PREFIX foaf: <http://xmlns.com/foaf/0.1/> MATCH (v { foaf::name : "Alice Smith"}) RETURN v

Case #3: Edge

A triple like:

<http://example.com/Alice> <http://example.com/knows> <http://example.com/Bob>

is equivalent to defining with OpenCypher an edge like this, where the edge label and vertices ids are all IRIs:

CREATE ({`~id`: "<http://example.com/Alice>"}) -[:`<http://example.com/knows>`]->({`~id`: "<http://example.com/Bob>"})

or equivalently:

PREFIX ex: <http://example.com/> CREATE ({`~id`: ex::Alice })-[: ex::knows ]->({`~id`: ex::Bob })

To match the edges with that label:

MATCH (v)-[:`<http://example.com/knows>`]->(w) RETURN v, w

or equivalently:

PREFIX ex: <http://example.com/> MATCH (v)-[: ex::knows ]->(w) RETURN v, w

Query Examples

Matching language-tagged literals

If this triple was loaded from a dataset:

<http://example.com/German> <http://example.com/greeting> "Hallo"@de

then it will not be matched by this query:

MATCH (n) WHERE n.`<http://example.com/greeting>` = "Hallo"

because the language-tagged literal "Hallo"@de and the string “Hallo” are not equal. For more information, see Language-tagged literals. The query can use TOSTRING() in order to find the match:

MATCH (n) WHERE TOSTRING(n.`<http://example.com/greeting>`) = "Hallo"