cancel
Showing results for 
Search instead for 
Did you mean: 

Neo4j literal representation in RDF/RDF* graph

philippe_carrie
Node Link

I'm currently trying to export a Neo4j graph to RDF, while minimizing the number of triples that is created in the process. One place where I found that the triple could be reduce is in place where we would represent, at least in RDF, a literal. In Neo4j, as far as I know, we can't represent literal since a nodes needs to have key value pairs

For example, if I was to create the following:

CREATE (n:Resource {uri: 'http://example.com/..'})-[e:hasParameter {parameterValue: "parameter"}]->(m:Literal {value: 'value'})


The resulting RDF, would be:

@prefix n4sch: <neo4j://graph.schema#> .
@prefix n4ind: <neo4j://graph.individuals#> .

<http://example.com/..> n4sch:hasParameter n4ind:3242 .

<<<http://example.com/..> n4sch:hasParameter n4ind:3242>> n4sch:parameterValue "parameter" .

n4ind:3242 a n4sch:Literal;
  n4sch:value "value" .


Here, we are basically creating a node in place of a literal.

My goal is to have this corresponding RDF notation:

<<<http://example.com/..> n4sch:hasParameter "value">> n4sch:parameterValue "parameter" .

Is there a way that I can have this result without exporting the literal node?

n4ind:3242 a n4sch:Literal;
  n4sch:value "value" .

Thanks

2 REPLIES 2

Hi @philippe.carrier22 ,
I think it can be a lot simpler than that. If all you want is a resource with a property and a literal value you only need one node and the literal property will be a node property. Here's what I mean:

CREATE (n:Resource {uri: 'http://example.com/123', parameter: "value"})

then you can serialise this node as rdf using /rdf/<gdb>/cypher as follows:

:post /rdf/neo4j/cypher
{"cypher": "match (n:Resource) where n.uri = 'http://example.com/123' return n"}

producing:

@prefix n4sch: <neo4j://graph.schema#> .
@prefix n4ind: <neo4j://graph.individuals#> .

<http://example.com/123> n4sch:parameter "value" .

I don't think a simple statement like this requires RDF_Star. Agree?

Hope this helps.

JB.

Hi @jesus.barrasa,
Your solution is indeed simple and would work in the majority of the cases. However in my case, prior to importing data into my graph, I don't have any knowledge of what constitute a parameter. Using this solution would result in a RDF graph without the complete picture of our relation.

Let's look at it contextually:

<<<http://example.com/..> n4sch:hasParameter "parameter_name">> n4sch:parameterValue "parameter_value" .

Here, parameter_name can be anything so I need to keep the knowledge of this value being a parameter. This is the reason behind the usage of RDF*. Without it, I would not be able to find the parameters in the resulting RDF graph.

Thinking about it, your solution might work if I was to mapped the resource to the right URI when I import the value inside the graph. But even if it works, right now the ontology that I'm using is following the RDF* solution. So I'm a little bit stuck with what I can do.

Anyway, from what I can understand, I'm assuming that there is presently no solution for what I'm looking, am I right?

Thanks for your help.

Philippe

Nodes 2022
Nodes
NODES 2022, Neo4j Online Education Summit

On November 16 and 17 for 24 hours across all timezones, you’ll learn about best practices for beginners and experts alike.