-
Notifications
You must be signed in to change notification settings - Fork 159
Description
We are encountering an issue when converting RDF Datasets to JSON-LD.
The problem is with blank nodes that are shared between graphs and lists.
In TriG (yes, this is a synthetic reduced test case that captures a
smaller example that might appear for real):
# Bnode references across graph and lists
PREFIX : <http://www.example.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
:G {
# Written in short form it would be:
# :z :q ("cell-A" "cell-B")
# but we want to share the tail ("cell-B")
:z :q _:z0 .
_:z0 rdf:first "cell-A" .
_:z0 rdf:rest _:z1 .
_:z1 rdf:first "cell-B" .
_:z1 rdf:rest rdf:nil .
}
:G1 {
# This references the tail ("cell-B")
:x :p _:z1 .
}
The triple in :G1 references into the list in :G.
But as we understand the conversion algorithm, section 4 only considers
each graph in turn and so does not see the cross graph sharing.
Is this a correct reading of the spec text?
Part 4 of the conversion algorithm has
"For each name and graph object in graph map: "
so 4.3.3.* walks back up the list in one graph only.
(Conversion generated by jsonld-java : it does not matter if compaction
is applied or not):
{
"@graph" : [ {
"@graph" : [ {
"@id" : ":z",
":q" : {
"@list" : [ "cell-A", "cell-B" ]
}
} ],
"@id" : ":G"
}, {
"@graph" : [ {
"@id" : ":x",
":p" : {
"@id" : "_:b1"
}
} ],
"@id" : ":G1"
} ],
"@context" : {
"@base" : "http://www.example.com/",
"" : "http://www.example.com/",
"rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
}
}
There is no _:b1 in :G to refer to because the algorith generated @list
and its implicit bNodes don't have labels.
This is a different dataset with no shared bNode.
If it is all the same graph (s/:G1/:G/), the RDF dataset structure is
correctly serialized.
Andy