diff --git a/test-cases/RMLTC0022c-JSON/README.md b/test-cases/RMLTC0022c-JSON/README.md
index 72870ba6..d7d0afc6 100644
--- a/test-cases/RMLTC0022c-JSON/README.md
+++ b/test-cases/RMLTC0022c-JSON/README.md
@@ -1,8 +1,8 @@
## RMLTC0022c-JSON
-**Title**: "Generating of triples with datatypeMap with custom datatype"
+**Title**: "Generating of triples with a template-valued datatypeMap"
-**Description**: "Test triples with a custom datype from the data"
+**Description**: "Test triples with a template-valued datatypeMap"
**Default Base IRI**: http://example.com/
diff --git a/test-cases/RMLTC0022d-JSON/README.md b/test-cases/RMLTC0022d-JSON/README.md
new file mode 100644
index 00000000..51d0812e
--- /dev/null
+++ b/test-cases/RMLTC0022d-JSON/README.md
@@ -0,0 +1,54 @@
+## RMLTC0022d-JSON
+
+**Title**: "Generating of triples with a constant-valued datatypeMap"
+
+**Description**: "Test triples with a constant-valued datatypeMap"
+
+**Default Base IRI**: http://example.com/
+
+**Error expected?** No
+
+**Input**
+```
+[
+ { "FOO": 1, "BAR": "string"},
+ { "FOO": 2, "BAR": "int"}
+]
+
+```
+
+**Mapping**
+```
+@prefix ex: .
+@prefix rml: .
+@prefix xsd: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:referenceFormulation rml:JSONPath;
+ rml:iterator "$[*]";
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "data.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:datatypeMap [
+ rml:constant xsd:integer
+ ];
+ rml:reference "$.FOO"
+ ];
+ rml:predicate ex:x
+ ];
+ rml:subjectMap [
+ rml:template "http://example.com/{$.FOO}"
+ ] .
+```
+
+**Output**
+```
+ "1"^^ .
+ "2"^^ .
+```
+
diff --git a/test-cases/RMLTC0022d-JSON/data.json b/test-cases/RMLTC0022d-JSON/data.json
new file mode 100644
index 00000000..6b0dcef9
--- /dev/null
+++ b/test-cases/RMLTC0022d-JSON/data.json
@@ -0,0 +1,4 @@
+[
+ { "FOO": 1, "BAR": "string"},
+ { "FOO": 2, "BAR": "int"}
+]
diff --git a/test-cases/RMLTC0022d-JSON/mapping.ttl b/test-cases/RMLTC0022d-JSON/mapping.ttl
new file mode 100644
index 00000000..40692246
--- /dev/null
+++ b/test-cases/RMLTC0022d-JSON/mapping.ttl
@@ -0,0 +1,25 @@
+@prefix ex: .
+@prefix rml: .
+@prefix xsd: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:referenceFormulation rml:JSONPath;
+ rml:iterator "$[*]";
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "data.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:datatypeMap [
+ rml:constant xsd:integer
+ ];
+ rml:reference "$.FOO"
+ ];
+ rml:predicate ex:x
+ ];
+ rml:subjectMap [
+ rml:template "http://example.com/{$.FOO}"
+ ] .
\ No newline at end of file
diff --git a/test-cases/RMLTC0022d-JSON/output.nq b/test-cases/RMLTC0022d-JSON/output.nq
new file mode 100644
index 00000000..1382ad87
--- /dev/null
+++ b/test-cases/RMLTC0022d-JSON/output.nq
@@ -0,0 +1,2 @@
+ "1"^^ .
+ "2"^^ .
\ No newline at end of file
diff --git a/test-cases/RMLTC0022e-JSON/README.md b/test-cases/RMLTC0022e-JSON/README.md
new file mode 100644
index 00000000..15190551
--- /dev/null
+++ b/test-cases/RMLTC0022e-JSON/README.md
@@ -0,0 +1,54 @@
+## RMLTC0022e-JSON
+
+**Title**: "Generating of triples with a reference-valued datatypeMap"
+
+**Description**: "Test triples with a reference-valued datatypeMap"
+
+**Default Base IRI**: http://example.com/
+
+**Error expected?** No
+
+**Input**
+```
+[
+ { "FOO": 1, "BAR": "http://www.w3.org/2001/XMLSchema#string"},
+ { "FOO": 2, "BAR": "http://www.w3.org/2001/XMLSchema#int"}
+]
+
+```
+
+**Mapping**
+```
+@prefix ex: .
+@prefix rml: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:referenceFormulation rml:JSONPath;
+ rml:iterator "$[*]";
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "data.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:datatypeMap [
+ rml:reference "BAR";
+ rml:termType rml:IRI
+ ];
+ rml:reference "$.FOO"
+ ];
+ rml:predicate ex:x
+ ];
+ rml:subjectMap [
+ rml:template "http://example.com/{$.FOO}"
+ ] .
+```
+
+**Output**
+```
+ "1"^^ .
+ "2"^^ .
+```
+
diff --git a/test-cases/RMLTC0022e-JSON/data.json b/test-cases/RMLTC0022e-JSON/data.json
new file mode 100644
index 00000000..508cc270
--- /dev/null
+++ b/test-cases/RMLTC0022e-JSON/data.json
@@ -0,0 +1,4 @@
+[
+ { "FOO": 1, "BAR": "http://www.w3.org/2001/XMLSchema#string"},
+ { "FOO": 2, "BAR": "http://www.w3.org/2001/XMLSchema#int"}
+]
diff --git a/test-cases/RMLTC0022e-JSON/mapping.ttl b/test-cases/RMLTC0022e-JSON/mapping.ttl
new file mode 100644
index 00000000..b6e25665
--- /dev/null
+++ b/test-cases/RMLTC0022e-JSON/mapping.ttl
@@ -0,0 +1,25 @@
+@prefix ex: .
+@prefix rml: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:referenceFormulation rml:JSONPath;
+ rml:iterator "$[*]";
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "data.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:datatypeMap [
+ rml:reference "BAR";
+ rml:termType rml:IRI
+ ];
+ rml:reference "$.FOO"
+ ];
+ rml:predicate ex:x
+ ];
+ rml:subjectMap [
+ rml:template "http://example.com/{$.FOO}"
+ ] .
\ No newline at end of file
diff --git a/test-cases/RMLTC0022e-JSON/output.nq b/test-cases/RMLTC0022e-JSON/output.nq
new file mode 100644
index 00000000..c81c7378
--- /dev/null
+++ b/test-cases/RMLTC0022e-JSON/output.nq
@@ -0,0 +1,2 @@
+ "1"^^ .
+ "2"^^ .
\ No newline at end of file
diff --git a/test-cases/RMLTC0029a-JSON/README.md b/test-cases/RMLTC0029a-JSON/README.md
new file mode 100644
index 00000000..167bf474
--- /dev/null
+++ b/test-cases/RMLTC0029a-JSON/README.md
@@ -0,0 +1,48 @@
+## RMLTC0029a-JSON
+
+**Title**: "Generating of triples with constant shortcut subject"
+
+**Description**: "Test triples with a constant shortcut subject from the data"
+
+**Default Base IRI**: http://example.com/
+
+**Error expected?** No
+
+**Input**
+```
+[
+ { "FOO": "one", "BAR": "string"},
+ { "FOO": "two", "BAR": "int"}
+]
+
+```
+
+**Mapping**
+```
+@prefix ex: .
+@prefix rml: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:referenceFormulation rml:JSONPath;
+ rml:iterator "$[*]";
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "data.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:reference "$.FOO"
+ ];
+ rml:predicate ex:x
+ ];
+ rml:subject ex:example .
+```
+
+**Output**
+```
+ "one" .
+ "two" .
+```
+
diff --git a/test-cases/RMLTC0029a-JSON/data.json b/test-cases/RMLTC0029a-JSON/data.json
new file mode 100644
index 00000000..af9269c7
--- /dev/null
+++ b/test-cases/RMLTC0029a-JSON/data.json
@@ -0,0 +1,4 @@
+[
+ { "FOO": "one", "BAR": "string"},
+ { "FOO": "two", "BAR": "int"}
+]
diff --git a/test-cases/RMLTC0029a-JSON/mapping.ttl b/test-cases/RMLTC0029a-JSON/mapping.ttl
new file mode 100644
index 00000000..6942bc08
--- /dev/null
+++ b/test-cases/RMLTC0029a-JSON/mapping.ttl
@@ -0,0 +1,19 @@
+@prefix ex: .
+@prefix rml: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:referenceFormulation rml:JSONPath;
+ rml:iterator "$[*]";
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "data.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:reference "$.FOO"
+ ];
+ rml:predicate ex:x
+ ];
+ rml:subject ex:example .
\ No newline at end of file
diff --git a/test-cases/RMLTC0029a-JSON/output.nq b/test-cases/RMLTC0029a-JSON/output.nq
new file mode 100644
index 00000000..9d83ff89
--- /dev/null
+++ b/test-cases/RMLTC0029a-JSON/output.nq
@@ -0,0 +1,2 @@
+ "one" .
+ "two" .
\ No newline at end of file
diff --git a/test-cases/RMLTC0030a-JSON/README.md b/test-cases/RMLTC0030a-JSON/README.md
new file mode 100644
index 00000000..00ed2f96
--- /dev/null
+++ b/test-cases/RMLTC0030a-JSON/README.md
@@ -0,0 +1,115 @@
+## RMLTC0030a-JSON
+
+**Title**: "Generation of triples from a join with reference-valued parentMap and childMap"
+
+**Description**: "Test the results from a join with reference-valued parentMap and childMap"
+
+**Default Base IRI**: http://example.com/
+
+**Error expected?** No
+
+**Input**
+```
+{
+ "students" : [
+ {
+ "ID": 10,
+ "Sport": 100,
+ "Name": "Venus Williams"
+ },
+ {
+ "ID": 20,
+ "Sport": 300,
+ "Name": "Demi Moore"
+ }
+ ]
+}
+```
+
+**Input 1**
+```
+{
+ "sports": [
+ {
+ "ID": 100,
+ "Name": "Tennis"
+ },
+ {
+ "ID": 200,
+ "Name": "Football"
+ }
+ ]
+}
+```
+
+**Mapping**
+```
+@prefix foaf: .
+@prefix rdfs: .
+@prefix rml: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.students[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "student.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:graph ;
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate foaf:name
+ ], [
+ rml:graph ;
+ rml:objectMap [ a rml:RefObjectMap;
+ rml:joinCondition [
+ rml:parentMap [ rml:reference "$.ID" ];
+ rml:childMap [ rml:reference "$.Sport" ];
+ ];
+ rml:parentTriplesMap
+ ];
+ rml:predicate
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/student_{$.ID}"
+ ] .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.sports[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "sport.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate rdfs:label
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/sport_{$.ID}"
+ ] .
+```
+
+**Output**
+```
+ .
+ "Venus Williams" .
+ .
+ "Demi Moore".
+ .
+ "Tennis" .
+ .
+ .
+ "Football" .
+```
+
diff --git a/test-cases/RMLTC0030a-JSON/mapping.ttl b/test-cases/RMLTC0030a-JSON/mapping.ttl
new file mode 100644
index 00000000..82ffc338
--- /dev/null
+++ b/test-cases/RMLTC0030a-JSON/mapping.ttl
@@ -0,0 +1,54 @@
+@prefix foaf: .
+@prefix rdfs: .
+@prefix rml: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.students[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "student.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:graph ;
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate foaf:name
+ ], [
+ rml:graph ;
+ rml:objectMap [ a rml:RefObjectMap;
+ rml:joinCondition [
+ rml:parentMap [ rml:reference "$.ID" ];
+ rml:childMap [ rml:reference "$.Sport" ];
+ ];
+ rml:parentTriplesMap
+ ];
+ rml:predicate
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/student_{$.ID}"
+ ] .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.sports[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "sport.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate rdfs:label
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/sport_{$.ID}"
+ ] .
\ No newline at end of file
diff --git a/test-cases/RMLTC0030a-JSON/output.nq b/test-cases/RMLTC0030a-JSON/output.nq
new file mode 100644
index 00000000..fc03c2a9
--- /dev/null
+++ b/test-cases/RMLTC0030a-JSON/output.nq
@@ -0,0 +1,9 @@
+ .
+ "Venus Williams" .
+ .
+ "Demi Moore".
+ .
+ "Tennis" .
+ .
+ .
+ "Football" .
\ No newline at end of file
diff --git a/test-cases/RMLTC0030a-JSON/sport.json b/test-cases/RMLTC0030a-JSON/sport.json
new file mode 100644
index 00000000..314277a1
--- /dev/null
+++ b/test-cases/RMLTC0030a-JSON/sport.json
@@ -0,0 +1,12 @@
+{
+ "sports": [
+ {
+ "ID": 100,
+ "Name": "Tennis"
+ },
+ {
+ "ID": 200,
+ "Name": "Football"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-cases/RMLTC0030a-JSON/student.json b/test-cases/RMLTC0030a-JSON/student.json
new file mode 100644
index 00000000..1a65a1c0
--- /dev/null
+++ b/test-cases/RMLTC0030a-JSON/student.json
@@ -0,0 +1,14 @@
+{
+ "students" : [
+ {
+ "ID": 10,
+ "Sport": 100,
+ "Name": "Venus Williams"
+ },
+ {
+ "ID": 20,
+ "Sport": 300,
+ "Name": "Demi Moore"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-cases/RMLTC0030b-JSON/README.md b/test-cases/RMLTC0030b-JSON/README.md
new file mode 100644
index 00000000..c417b196
--- /dev/null
+++ b/test-cases/RMLTC0030b-JSON/README.md
@@ -0,0 +1,115 @@
+## RMLTC0030b-JSON
+
+**Title**: "Generation of triples from a join with template-valued parentMap and childMap"
+
+**Description**: "Test that results from a join with template-valued parentMap and childMap"
+
+**Default Base IRI**: http://example.com/
+
+**Error expected?** No
+
+**Input**
+```
+{
+ "students" : [
+ {
+ "ID": 10,
+ "Sport": 100,
+ "Name": "Venus Williams"
+ },
+ {
+ "ID": 20,
+ "Sport":300,
+ "Name": "Demi Moore"
+ }
+ ]
+}
+```
+
+**Input 1**
+```
+{
+ "sports": [
+ {
+ "ID": 100,
+ "Name": "Tennis"
+ },
+ {
+ "ID": 200,
+ "Name": "Football"
+ }
+ ]
+}
+```
+
+**Mapping**
+```
+@prefix foaf: .
+@prefix rdfs: .
+@prefix rml: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.students[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "student.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:graph ;
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate foaf:name
+ ], [
+ rml:graph ;
+ rml:objectMap [ a rml:RefObjectMap;
+ rml:joinCondition [
+ rml:parentMap [ rml:template "http://example.com/{$.ID}" ];
+ rml:childMap [ rml:template "http://example.com/{$.Sport}" ];
+ ];
+ rml:parentTriplesMap
+ ];
+ rml:predicate
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/student_{$.ID}"
+ ] .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.sports[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "sport.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate rdfs:label
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/sport_{$.ID}"
+ ] .
+```
+
+**Output**
+```
+ .
+ "Venus Williams" .
+ .
+ "Demi Moore".
+ .
+ "Tennis" .
+ .
+ .
+ "Football" .
+```
+
diff --git a/test-cases/RMLTC0030b-JSON/mapping.ttl b/test-cases/RMLTC0030b-JSON/mapping.ttl
new file mode 100644
index 00000000..9bc6a00a
--- /dev/null
+++ b/test-cases/RMLTC0030b-JSON/mapping.ttl
@@ -0,0 +1,54 @@
+@prefix foaf: .
+@prefix rdfs: .
+@prefix rml: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.students[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "student.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:graph ;
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate foaf:name
+ ], [
+ rml:graph ;
+ rml:objectMap [ a rml:RefObjectMap;
+ rml:joinCondition [
+ rml:parentMap [ rml:template "http://example.com/{$.ID}" ];
+ rml:childMap [ rml:template "http://example.com/{$.Sport}" ];
+ ];
+ rml:parentTriplesMap
+ ];
+ rml:predicate
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/student_{$.ID}"
+ ] .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.sports[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "sport.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate rdfs:label
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/sport_{$.ID}"
+ ] .
\ No newline at end of file
diff --git a/test-cases/RMLTC0030b-JSON/output.nq b/test-cases/RMLTC0030b-JSON/output.nq
new file mode 100644
index 00000000..fc03c2a9
--- /dev/null
+++ b/test-cases/RMLTC0030b-JSON/output.nq
@@ -0,0 +1,9 @@
+ .
+ "Venus Williams" .
+ .
+ "Demi Moore".
+ .
+ "Tennis" .
+ .
+ .
+ "Football" .
\ No newline at end of file
diff --git a/test-cases/RMLTC0030b-JSON/sport.json b/test-cases/RMLTC0030b-JSON/sport.json
new file mode 100644
index 00000000..314277a1
--- /dev/null
+++ b/test-cases/RMLTC0030b-JSON/sport.json
@@ -0,0 +1,12 @@
+{
+ "sports": [
+ {
+ "ID": 100,
+ "Name": "Tennis"
+ },
+ {
+ "ID": 200,
+ "Name": "Football"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-cases/RMLTC0030b-JSON/student.json b/test-cases/RMLTC0030b-JSON/student.json
new file mode 100644
index 00000000..fa5599a9
--- /dev/null
+++ b/test-cases/RMLTC0030b-JSON/student.json
@@ -0,0 +1,14 @@
+{
+ "students" : [
+ {
+ "ID": 10,
+ "Sport": 100,
+ "Name": "Venus Williams"
+ },
+ {
+ "ID": 20,
+ "Sport":300,
+ "Name": "Demi Moore"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-cases/RMLTC0030c-JSON/README.md b/test-cases/RMLTC0030c-JSON/README.md
new file mode 100644
index 00000000..c482f484
--- /dev/null
+++ b/test-cases/RMLTC0030c-JSON/README.md
@@ -0,0 +1,115 @@
+## RMLTC0030c-JSON
+
+**Title**: "Generation of triples from a join with constant-valued parentMap"
+
+**Description**: "Test that results from a join with constant-valued parentMap"
+
+**Default Base IRI**: http://example.com/
+
+**Error expected?** No
+
+**Input**
+```
+{
+ "students" : [
+ {
+ "ID": 10,
+ "Sport": 100,
+ "Name": "Venus Williams"
+ },
+ {
+ "ID": 20,
+ "Sport": 300,
+ "Name": "Demi Moore"
+ }
+ ]
+}
+```
+
+**Input 1**
+```
+{
+ "sports": [
+ {
+ "ID": 100,
+ "Name": "Tennis"
+ },
+ {
+ "ID": 200,
+ "Name": "Football"
+ }
+ ]
+}
+```
+
+**Mapping**
+```
+@prefix foaf: .
+@prefix rdfs: .
+@prefix rml: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.students[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "student.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:graph ;
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate foaf:name
+ ], [
+ rml:graph ;
+ rml:objectMap [ a rml:RefObjectMap;
+ rml:joinCondition [
+ rml:parentMap [ rml:constant "100" ];
+ rml:childMap [ rml:reference "$.Sport" ];
+ ];
+ rml:parentTriplesMap
+ ];
+ rml:predicate
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/student_{$.ID}"
+ ] .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.sports[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "sport.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate rdfs:label
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/sport_{$.ID}"
+ ] .
+```
+
+**Output**
+```
+ .
+ "Venus Williams" .
+ .
+ "Demi Moore".
+ .
+ "Tennis" .
+ .
+ .
+ "Football" .
+```
+
diff --git a/test-cases/RMLTC0030c-JSON/mapping.ttl b/test-cases/RMLTC0030c-JSON/mapping.ttl
new file mode 100644
index 00000000..3712d15e
--- /dev/null
+++ b/test-cases/RMLTC0030c-JSON/mapping.ttl
@@ -0,0 +1,54 @@
+@prefix foaf: .
+@prefix rdfs: .
+@prefix rml: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.students[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "student.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:graph ;
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate foaf:name
+ ], [
+ rml:graph ;
+ rml:objectMap [ a rml:RefObjectMap;
+ rml:joinCondition [
+ rml:parentMap [ rml:constant "100" ];
+ rml:childMap [ rml:reference "$.Sport" ];
+ ];
+ rml:parentTriplesMap
+ ];
+ rml:predicate
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/student_{$.ID}"
+ ] .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.sports[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "sport.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate rdfs:label
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/sport_{$.ID}"
+ ] .
\ No newline at end of file
diff --git a/test-cases/RMLTC0030c-JSON/output.nq b/test-cases/RMLTC0030c-JSON/output.nq
new file mode 100644
index 00000000..fc03c2a9
--- /dev/null
+++ b/test-cases/RMLTC0030c-JSON/output.nq
@@ -0,0 +1,9 @@
+ .
+ "Venus Williams" .
+ .
+ "Demi Moore".
+ .
+ "Tennis" .
+ .
+ .
+ "Football" .
\ No newline at end of file
diff --git a/test-cases/RMLTC0030c-JSON/sport.json b/test-cases/RMLTC0030c-JSON/sport.json
new file mode 100644
index 00000000..314277a1
--- /dev/null
+++ b/test-cases/RMLTC0030c-JSON/sport.json
@@ -0,0 +1,12 @@
+{
+ "sports": [
+ {
+ "ID": 100,
+ "Name": "Tennis"
+ },
+ {
+ "ID": 200,
+ "Name": "Football"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-cases/RMLTC0030c-JSON/student.json b/test-cases/RMLTC0030c-JSON/student.json
new file mode 100644
index 00000000..1a65a1c0
--- /dev/null
+++ b/test-cases/RMLTC0030c-JSON/student.json
@@ -0,0 +1,14 @@
+{
+ "students" : [
+ {
+ "ID": 10,
+ "Sport": 100,
+ "Name": "Venus Williams"
+ },
+ {
+ "ID": 20,
+ "Sport": 300,
+ "Name": "Demi Moore"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-cases/RMLTC0030d-JSON/README.md b/test-cases/RMLTC0030d-JSON/README.md
new file mode 100644
index 00000000..f998f9c5
--- /dev/null
+++ b/test-cases/RMLTC0030d-JSON/README.md
@@ -0,0 +1,115 @@
+## RMLTC0030d-JSON
+
+**Title**: "Generation of triples from a join with constant-valued parentMap"
+
+**Description**: "Test that results from a join with constant-valued parentMap"
+
+**Default Base IRI**: http://example.com/
+
+**Error expected?** No
+
+**Input**
+```
+{
+ "students" : [
+ {
+ "ID": 10,
+ "Sport": 100,
+ "Name": "Venus Williams"
+ },
+ {
+ "ID": 20,
+ "Sport": 300,
+ "Name": "Demi Moore"
+ }
+ ]
+}
+```
+
+**Input 1**
+```
+{
+ "sports": [
+ {
+ "ID": 100,
+ "Name": "Tennis"
+ },
+ {
+ "ID": 200,
+ "Name": "Football"
+ }
+ ]
+}
+```
+
+**Mapping**
+```
+@prefix foaf: .
+@prefix rdfs: .
+@prefix rml: .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.students[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "student.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:graph ;
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate foaf:name
+ ], [
+ rml:graph ;
+ rml:objectMap [ a rml:RefObjectMap;
+ rml:joinCondition [
+ rml:parentMap [ rml:constant "http://example.com/100" ];
+ rml:childMap [ rml:template "http://example.com/{$.Sport}" ];
+ ];
+ rml:parentTriplesMap
+ ];
+ rml:predicate
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/student_{$.ID}"
+ ] .
+
+ a rml:TriplesMap;
+ rml:logicalSource [ a rml:LogicalSource;
+ rml:iterator "$.sports[*]";
+ rml:referenceFormulation rml:JSONPath;
+ rml:source [ a rml:RelativePathSource;
+ rml:root rml:MappingDirectory;
+ rml:path "sport.json"
+ ]
+ ];
+ rml:predicateObjectMap [
+ rml:objectMap [
+ rml:reference "$.Name"
+ ];
+ rml:predicate rdfs:label
+ ];
+ rml:subjectMap [
+ rml:class ;
+ rml:template "http://example.com/resource/sport_{$.ID}"
+ ] .
+```
+
+**Output**
+```
+ .
+ "Venus Williams" .
+ .
+ "Demi Moore".
+ .
+