I have a JSON of the following form:
[
{
"crew":[
{
"id":123,
"job":"Director",
"name":"Director Testname",
},
{
"id":456,
"job":"Screenplay",
"name":"Crew Testname",
}
],
"id":789
}
The "id":862 represents a film. From the crew array I want to create a Directors class. Both should be linked through hasDirector.
My YARRRML.yaml looks like this:
prefixes:
film: "http://example.com/film#"
mappings:
films:
sources:
- ['data.json~jsonpath', '$.[*]']
s: film:film$(id)
po:
- [a, film:Film]
- p: film:hasDirector
o:
value: film:Director$(crew['?(@.job=="Director")'].id)
type: iri
directors:
sources:
- ['data.json~jsonpath', '$[*].crew[?(@.job == "Director")]']
s: film:Director$(id)
po:
- [a, film:Director]
- [film:fullName, $(name)]
This returns no mappings via hasDirector, but provides all Directors instances. I created through Matey the RML Mapping and with rmlmapper-java I've created the RDF.
Alternatively I've also tried:
- p: film:hasDirector
o:
mapping: directors
condition:
function: equal
parameters:
- [str1, $(crew.id), s]
- [str2, "Director", o]
This resulted in all entities in the crew array were linked to film as directors.
Has someone a solution how to fix that?
As for the first way it appears that JSONPath conditions just don't work in YARRRML (or at least I found no way of making them work in the object mapping).
For the second, you need to use the
condition
statement, imposing the equality on.job
and reporting the.id
when a positive match is found: