Copyright © 2024-2025 the Contributors to the RML-LV: Test Cases Specification, published by the Knowledge Graph Construction Community Group under the W3C Community Contributor License Agreement (CLA). A human-readable summary is available.
This document defines the RML-LV test cases to the determine the RML-LV specification conformance of tools.
This specification was published by the Knowledge Graph Construction Community Group. It is not a W3C Standard nor is it on the W3C Standards Track. Please note that under the W3C Community Contributor License Agreement (CLA) there is a limited opt-out and other conditions apply. Learn more about W3C Community and Business Groups.
GitHub Issues are preferred for discussion of this specification.
This document defines the RML-LV test cases, consisting of a collection of test case documents (input and expected output). The purpose of the test cases is to determine the conformance of tools that execute RML rules to the RML-LV specification.
The test cases are semantically described for re-usability and shareability following the W3C Test case description.
Each test:Testcase
as the following properties:
dcterms:identifier
: unique ID of the test case.rmltest:hasError
: if an error of the RML Processor is expected or not.rmltest:input
: One or more input data of the test case.rmltest:output
: One or more output data of the test case.rmltest:inputFormat
: the input data format.rmltest:outputFormat
: the output data format.rmltest:mappingDocument
: the RML mapping rules in Turtle.This section describes the RML-LV test cases. These descriptions are also available as RDF.
The files are available on GitHub in the folder test-cases
.
Each test case is contained in a single folder, containing three types of files:
mapping.ttl
, in the Turtle format.Title: Logical view on JSON source
Description: Test a view on a hierarchical source
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasName ;
rml:objectMap [
rml:reference "name" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasName> "alice" .
<http://example.org/person/bob> <http://example.org/hasName> "bob" .
Title: Logical view on CSV source
Description: Test a view on a tabular source
Error expected? No
Input
name,birthyear
alice,1995
bob,1999
tobias,2005
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:csvSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:csvView a rml:LogicalView ;
rml:viewOn :csvSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :csvView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasName ;
rml:objectMap [
rml:reference "name" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasName> "alice" .
<http://example.org/person/bob> <http://example.org/hasName> "bob" .
<http://example.org/person/tobias> <http://example.org/hasName> "tobias" .
Title: Logical View on Logical View
Description: Test a view on a logical view
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] .
:jsonViewOnJsonView a rml:LogicalView ;
rml:viewOn :jsonView ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "newName" ;
rml:reference "name" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonViewOnJsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{newName}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasName ;
rml:objectMap [
rml:reference "newName" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasName> "alice" .
<http://example.org/person/bob> <http://example.org/hasName> "bob" .
Title: Expression Field: Reference
Description: Test a reference in an expression field
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasName ;
rml:objectMap [
rml:reference "name" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasName> "alice" .
<http://example.org/person/bob> <http://example.org/hasName> "bob" .
Title: Expression Field: Template
Description: Test a template in an expression field
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "race" ;
rml:constant "human" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasRace ;
rml:objectMap [
rml:reference "race" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasRace> "human" .
<http://example.org/person/bob> <http://example.org/hasRace> "human" .
Title: Expression Field: Constant
Description: Test a constant expression in an expression field
Error expected? No
Input
{
"people": [
{
"name": "alice",
"lastName": "smith",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"lastName": "jones",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "fullName" ;
rml:template "{name} {lastName}" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasFullName ;
rml:objectMap [
rml:reference "fullName" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasFullName> "alice smith" .
<http://example.org/person/bob> <http://example.org/hasFullName> "bob jones" .
Title: Expression Field Siblings
Description: Test multiple expression fields with the same parent
Error expected? No
Input
{
"people": [
{
"name": "alice",
"lastName": "smith",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"lastName": "jones",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "lastName" ;
rml:reference "$.lastName" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasFullName ;
rml:objectMap [
rml:template "{name} {lastName}" ;
rml:termType rml:Literal ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasFullName> "alice smith" .
<http://example.org/person/bob> <http://example.org/hasFullName> "bob jones" .
Title: Iterable Field
Description: Test a nested field construction: iterable field with expression field as child
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:IterableField ;
rml:fieldName "item" ;
rml:iterator "$.items[*]" ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "type" ;
rml:reference "$.type" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasItem ;
rml:objectMap [
rml:template "http://example.org/person/{name}/item/{item.type}" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasItem> <http://example.org/person/alice/item/sword> .
<http://example.org/person/alice> <http://example.org/hasItem> <http://example.org/person/alice/item/shield> .
<http://example.org/person/bob> <http://example.org/hasItem> <http://example.org/person/bob/item/flower> .
Title: Iterable Field with Multiple Children
Description: Test a nested field construction: iterable field with mulitple expression fields as children
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:IterableField ;
rml:fieldName "item" ;
rml:iterator "$.items[*]" ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "type" ;
rml:reference "$.type" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "weight" ;
rml:reference "$.weight" ;
] ;
] .
:triplesMapItem a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}/item/{item.type}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasName ;
rml:objectMap [
rml:reference "item.type" ;
] ;
] ;
rml:predicateObjectMap [
rml:predicate :hasWeight ;
rml:objectMap [
rml:reference "item.weight" ;
rml:datatype xsd:integer ;
] ;
] .
Output
<http://example.org/person/alice/item/sword> <http://example.org/hasName> "sword" .
<http://example.org/person/alice/item/sword> <http://example.org/hasWeight> "1500"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/person/alice/item/shield> <http://example.org/hasName> "shield" .
<http://example.org/person/alice/item/shield> <http://example.org/hasWeight> "2500"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/person/bob/item/flower> <http://example.org/hasName> "flower" .
<http://example.org/person/bob/item/flower> <http://example.org/hasWeight> "15"^^<http://www.w3.org/2001/XMLSchema#integer> .
Title: Nested Iterable Fields
Description: Test a nested field construction: iterable field with an iterable field as child
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"measures": {
"weight": 1500,
"length": 30
}
},
{
"type": "shield",
"measures": {
"weight": 2500
}
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"measures" : {
"weight": 15,
"length" : 15
}
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:IterableField ;
rml:fieldName "item" ;
rml:iterator "$.items[*]" ;
rml:field [
rml:fieldName "type" ;
rml:reference "$.type" ;
] ;
rml:field [
a rml:IterableField ;
rml:fieldName "measures";
rml:iterator "$.measures";
rml:field [
a rml:ExpressionField ;
rml:fieldName "weight" ;
rml:reference "$.weight" ;
];
rml:field [
a rml:ExpressionField ;
rml:fieldName "length" ;
rml:reference "$.length" ;
]
] ;
] .
:triplesMapItem a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}/item/{item.type}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasWeight ;
rml:objectMap [
rml:reference "item.measures.weight" ;
rml:datatype xsd:integer ;
] ;
] .
Output
<http://example.org/person/alice/item/sword> <http://example.org/hasWeight> "1500"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/person/alice/item/shield> <http://example.org/hasWeight> "2500"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/person/bob/item/flower> <http://example.org/hasWeight> "15"^^<http://www.w3.org/2001/XMLSchema#integer> .
Title: Index Key: #
Description: Test a reference to the index key #
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasSequenceNumber ;
rml:objectMap [
rml:reference "#" ;
rml:datatype xsd:integer ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasSequenceNumber> "0"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/person/bob> <http://example.org/hasSequenceNumber> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .
Title: Index Key: Iterable Field
Description: Test a reference to the index key of an iterable field
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:IterableField ;
rml:fieldName "item" ;
rml:iterator "$.items[*]" ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "type" ;
rml:reference "$.type" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}/item/{item.#}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasType ;
rml:objectMap [
rml:reference "item.type" ;
] ;
] .
Output
<http://example.org/person/alice/item/0> <http://example.org/hasType> "sword" .
<http://example.org/person/alice/item/1> <http://example.org/hasType> "shield" .
<http://example.org/person/bob/item/0> <http://example.org/hasType> "flower" .
Title: Index Key: Expression field
Description: Test a reference to the index key of an expression field
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
"sword",
"shield"
]
},
{
"name": "bob",
"items": [
"flower"
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "item" ;
rml:reference "$.items[*]" ;
] .
:triplesMapItem a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}/item/{item.#}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasType ;
rml:objectMap [
rml:reference "item" ;
] ;
] .
Output
<http://example.org/person/alice/item/0> <http://example.org/hasType> "sword" .
<http://example.org/person/alice/item/1> <http://example.org/hasType> "shield" .
<http://example.org/person/bob/item/0> <http://example.org/hasType> "flower" .
Title: Natural Datatype: Index #
Description: Test the natural datatype mapping for the index #
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasSequenceNumber ;
rml:objectMap [
rml:reference "#" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasSequenceNumber> "0"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/person/bob> <http://example.org/hasSequenceNumber> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .
Title: Natural Datatype: Index Expression Field
Description: Test the natural datatype mapping for the index of an expression field
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:IterableField ;
rml:fieldName "item" ;
rml:iterator "$.items[*]" ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "type" ;
rml:reference "$.type" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}/item/{item.type}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasSequenceNumber ;
rml:objectMap [
rml:reference "item.#" ;
] ;
] .
Output
<http://example.org/person/alice/item/sword> <http://example.org/hasSequenceNumber> "0"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/person/alice/item/shield> <http://example.org/hasSequenceNumber> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/person/bob/item/flower> <http://example.org/hasSequenceNumber> "0"^^<http://www.w3.org/2001/XMLSchema#integer> .
Title: Natural Datatype: Index Iterable Field
Description: Test the natural datatype mapping for the index of an iterable field
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
"sword",
"shield"
]
},
{
"name": "bob",
"items": [
"flower"
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "item" ;
rml:reference "$.items[*]" ;
] .
:triplesMapItem a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}/item/{item}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasSequenceNumber ;
rml:objectMap [
rml:reference "item.#" ;
] ;
] .
Output
<http://example.org/person/alice/item/sword> <http://example.org/hasSequenceNumber> "0"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/person/alice/item/shield> <http://example.org/hasSequenceNumber> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/person/bob/item/flower> <http://example.org/hasSequenceNumber> "0"^^<http://www.w3.org/2001/XMLSchema#integer> .
Title: Natural Datatype: Record Expression Field
Description: Test the natural datatype mapping for a record of an expression field
Error expected? No
Input
{
"people": [
{
"name": "alice",
"birth_year": 1995
},
{
"name": "bob",
"birth_year": 1999
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "birthyear" ;
rml:reference "$.birth_year" ;
] .
:triplesMapItem a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasBirthYear ;
rml:objectMap [
rml:reference "birthyear" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasBirthYear> "1995"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/person/bob> <http://example.org/hasBirthYear> "1999"^^<http://www.w3.org/2001/XMLSchema#integer> .
Title: Referencing a Non-Existing Key
Description: Test a reference to a non-existing key
Error expected? Yes
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{Name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasName ;
rml:objectMap [
rml:reference "Name" ;
] ;
] .
Title: Referencing the Record Key
Description: Test a reference to the record key
Error expected? Yes
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :isDerivedFrom ;
rml:objectMap [
rml:reference "<it>" ;
] ;
] .
Title: Referencing the Record Key of an Iterable Field
Description: Test a reference to the record key of an iterable field
Error expected? Yes
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:IterableField ;
rml:fieldName "item" ;
rml:iterator "$.items[*]" ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "type" ;
rml:reference "$.type" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasItem ;
rml:objectMap [
rml:template "http://example.org/person/{name}/{item}" ;
] ;
] .
Title: Left Join
Description: Test a left join
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
"sword",
"shield"
]
},
{
"name": "bob",
"items": [
"flower"
]
}
]
}
Input 1
name,birthyear
alice,1995
bob,1999
tobias,2005
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "item" ;
rml:reference "$.items[*]" ;
] .
:csvSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:csvView a rml:LogicalView ;
rml:viewOn :csvSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "birthyear" ;
rml:reference "birthyear" ;
] ;
rml:leftJoin [
rml:parentLogicalView :jsonView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "json_item" ;
rml:reference "item" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :csvView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasBirthYear ;
rml:objectMap [
rml:reference "birthyear" ;
rml:datatype xsd:gYear ;
] ;
] ;
rml:predicateObjectMap [
rml:predicate :hasItem ;
rml:objectMap [
rml:template "http://example.org/person/{name}/item/{json_item}" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasBirthYear> "1995"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/alice> <http://example.org/hasItem> <http://example.org/person/alice/item/sword> .
<http://example.org/person/alice> <http://example.org/hasItem> <http://example.org/person/alice/item/shield> .
<http://example.org/person/bob> <http://example.org/hasBirthYear> "1999"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/bob> <http://example.org/hasItem> <http://example.org/person/bob/item/flower> .
<http://example.org/person/tobias> <http://example.org/hasBirthYear> "2005"^^<http://www.w3.org/2001/XMLSchema#gYear> .
Title: Inner Join
Description: Test an inner join
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
"sword",
"shield"
]
},
{
"name": "bob",
"items": [
"flower"
]
}
]
}
Input 1
name,birthyear
alice,1995
bob,1999
tobias,2005
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "item" ;
rml:reference "$.items[*]" ;
] .
:csvSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:csvView a rml:LogicalView ;
rml:viewOn :csvSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "birthyear" ;
rml:reference "birthyear" ;
] ;
rml:innerJoin [
rml:parentLogicalView :jsonView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "json_item" ;
rml:reference "item" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :csvView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasBirthYear ;
rml:objectMap [
rml:reference "birthyear" ;
rml:datatype xsd:gYear ;
] ;
] ;
rml:predicateObjectMap [
rml:predicate :hasItem ;
rml:objectMap [
rml:template "http://example.org/person/{name}/item/{json_item}" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasBirthYear> "1995"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/alice> <http://example.org/hasItem> <http://example.org/person/alice/item/sword> .
<http://example.org/person/alice> <http://example.org/hasItem> <http://example.org/person/alice/item/shield> .
<http://example.org/person/bob> <http://example.org/hasBirthYear> "1999"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/bob> <http://example.org/hasItem> <http://example.org/person/bob/item/flower> .
Title: Two Left Joins
Description: Test two left joins in one logical view
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
"sword",
"shield"
]
},
{
"name": "bob",
"items": [
"flower"
]
}
]
}
Input 1
name,birthyear
alice,1995
bob,1999
tobias,2005
Input 2
name,id
alice,123
bob,456
tobias,789
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "item" ;
rml:reference "$.items[*]" ;
] .
:additionalCsvSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people2.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:additionalCsvView a rml:LogicalView ;
rml:viewOn :additionalCsvSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "id" ;
rml:reference "id" ;
] ;
.
:csvSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:csvView a rml:LogicalView ;
rml:viewOn :csvSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "birthyear" ;
rml:reference "birthyear" ;
] ;
rml:leftJoin [
rml:parentLogicalView :jsonView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "json_item" ;
rml:reference "item" ;
] ;
] ;
rml:leftJoin [
rml:parentLogicalView :additionalCsvView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "csv2_id" ;
rml:reference "id" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :csvView ;
rml:subjectMap [
rml:template "http://example.org/person/{csv2_id}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasBirthYear ;
rml:objectMap [
rml:reference "birthyear" ;
rml:datatype xsd:gYear ;
] ;
] ;
rml:predicateObjectMap [
rml:predicate :hasItem ;
rml:objectMap [
rml:template "http://example.org/person/{csv2_id}/item/{json_item}" ;
] ;
] .
Output
<http://example.org/person/123> <http://example.org/hasBirthYear> "1995"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/123> <http://example.org/hasItem> <http://example.org/person/123/item/sword> .
<http://example.org/person/123> <http://example.org/hasItem> <http://example.org/person/123/item/shield> .
<http://example.org/person/456> <http://example.org/hasBirthYear> "1999"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/456> <http://example.org/hasItem> <http://example.org/person/456/item/flower> .
<http://example.org/person/789> <http://example.org/hasBirthYear> "2005"^^<http://www.w3.org/2001/XMLSchema#gYear> .
Title: Inner Join and Left Join
Description: Test an inner join and a left join in one logical view
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
"sword",
"shield"
]
},
{
"name": "bob",
"items": [
"flower"
]
}
]
}
Input 1
name,birthyear
alice,1995
bob,1999
tobias,2005
Input 2
name,id
alice,123
bob,456
tobias,789
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "item" ;
rml:reference "$.items[*]" ;
] .
:additionalCsvSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people2.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:additionalCsvView a rml:LogicalView ;
rml:viewOn :additionalCsvSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "id" ;
rml:reference "id" ;
] ;
.
:csvSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:csvView a rml:LogicalView ;
rml:viewOn :csvSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "birthyear" ;
rml:reference "birthyear" ;
] ;
rml:innerJoin [
rml:parentLogicalView :jsonView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "json_item" ;
rml:reference "item" ;
] ;
] ;
rml:leftJoin [
rml:parentLogicalView :additionalCsvView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "csv2_id" ;
rml:reference "id" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :csvView ;
rml:subjectMap [
rml:template "http://example.org/person/{csv2_id}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasBirthYear ;
rml:objectMap [
rml:reference "birthyear" ;
rml:datatype xsd:gYear ;
] ;
] ;
rml:predicateObjectMap [
rml:predicate :hasItem ;
rml:objectMap [
rml:template "http://example.org/person/{csv2_id}/item/{json_item}" ;
] ;
] .
Output
<http://example.org/person/123> <http://example.org/hasBirthYear> "1995"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/123> <http://example.org/hasItem> <http://example.org/person/123/item/sword> .
<http://example.org/person/123> <http://example.org/hasItem> <http://example.org/person/123/item/shield> .
<http://example.org/person/456> <http://example.org/hasBirthYear> "1999"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/456> <http://example.org/hasItem> <http://example.org/person/456/item/flower> .
Title: Two Inner Joins
Description: Test two left joins in one logical view
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
"sword",
"shield"
]
},
{
"name": "bob",
"items": [
"flower"
]
}
]
}
Input 1
name,birthyear
alice,1995
bob,1999
tobias,2005
Input 2
name,id
alice,123
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "item" ;
rml:reference "$.items[*]" ;
] .
:additionalCsvSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people2.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:additionalCsvView a rml:LogicalView ;
rml:viewOn :additionalCsvSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "id" ;
rml:reference "id" ;
] ;
.
:csvSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:csvView a rml:LogicalView ;
rml:viewOn :csvSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "birthyear" ;
rml:reference "birthyear" ;
] ;
rml:innerJoin [
rml:parentLogicalView :jsonView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "json_item" ;
rml:reference "item" ;
] ;
] ;
rml:innerJoin [
rml:parentLogicalView :additionalCsvView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "csv2_id" ;
rml:reference "id" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :csvView ;
rml:subjectMap [
rml:template "http://example.org/person/{csv2_id}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasBirthYear ;
rml:objectMap [
rml:reference "birthyear" ;
rml:datatype xsd:gYear ;
] ;
] ;
rml:predicateObjectMap [
rml:predicate :hasItem ;
rml:objectMap [
rml:template "http://example.org/person/{csv2_id}/item/{json_item}" ;
] ;
] .
Output
<http://example.org/person/123> <http://example.org/hasBirthYear> "1995"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/123> <http://example.org/hasItem> <http://example.org/person/123/item/sword> .
<http://example.org/person/123> <http://example.org/hasItem> <http://example.org/person/123/item/shield> .
Title: Index Key of Field in Join
Description: Test references to indexes of fields from a join
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
"sword",
"shield"
]
},
{
"name": "bob",
"items": [
"flower"
]
}
]
}
Input 1
name,birthyear
alice,1995
tobias,2005
bob,1999
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "item" ;
rml:reference "$.items[*]" ;
] .
:csvSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:csvView a rml:LogicalView ;
rml:viewOn :csvSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "birthyear" ;
rml:reference "birthyear" ;
] ;
rml:innerJoin [
rml:parentLogicalView :jsonView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "json_item" ;
rml:reference "item" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :csvView ;
rml:subjectMap [
rml:template "http://example.org/person/{#}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasBirthYear ;
rml:objectMap [
rml:reference "birthyear" ;
rml:datatype xsd:gYear ;
] ;
] ;
rml:predicateObjectMap [
rml:predicate :hasItem ;
rml:objectMap [
rml:template "http://example.org/person/{#}/item/{json_item.#}/{json_item}" ;
] ;
] .
Output
<http://example.org/person/0> <http://example.org/hasBirthYear> "1995"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/0> <http://example.org/hasItem> <http://example.org/person/0/item/0/sword> .
<http://example.org/person/0> <http://example.org/hasItem> <http://example.org/person/0/item/1/shield> .
<http://example.org/person/2> <http://example.org/hasBirthYear> "1999"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/2> <http://example.org/hasItem> <http://example.org/person/2/item/0/flower> .
Title: Change Reference Formulations: CSV including JSON array
Description: Test a change of reference formulations: csv source including json array
Error expected? No
Input
name,items
alice,"[{""type"":""sword"",""weight"":1500},{""type"":""shield"",""weight"":2500}]"
bob,"[{""type"":""flower"",""weight"":15}]"
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:mixedCSVSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:mixedCSVView a rml:LogicalView ;
rml:viewOn :mixedCSVSource ;
rml:field [
a rml:ExpressionField;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "items" ;
rml:reference "items" ;
rml:field [
a rml:IterableField ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$[*]" ;
rml:fieldName "item" ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "type" ;
rml:reference "$.type" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "weight" ;
rml:reference "$.weight" ;
] ;
] ;
] .
:triplesMapItem a rml:TriplesMap ;
rml:logicalSource :mixedCSVView ;
rml:subjectMap [
rml:template "http://example.org/item_{#}_{items.item.#}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasType ;
rml:objectMap [
rml:reference "items.item.type" ;
] ;
] ;
rml:predicateObjectMap [
rml:predicate :hasWeight ;
rml:objectMap [
rml:reference "items.item.weight" ;
rml:datatype xsd:integer ;
] ;
] .
Output
<http://example.org/item_0_0> <http://example.org/hasType> "sword" .
<http://example.org/item_0_0> <http://example.org/hasWeight> "1500"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/item_0_1> <http://example.org/hasType> "shield" .
<http://example.org/item_0_1> <http://example.org/hasWeight> "2500"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/item_1_0> <http://example.org/hasType> "flower" .
<http://example.org/item_1_0> <http://example.org/hasWeight> "15"^^<http://www.w3.org/2001/XMLSchema#integer> .
Title: Change Reference Formulations: CSV including JSON object
Description: Test a change of reference formulations: csv source including json object
Error expected? No
Input
name,item
alice,"{""type"":""sword"",""weight"":1500}"
alice,"{""type"":""shield"",""weight"":2500}"
bob,"{""type"":""flower"",""weight"":15}"
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:mixedCSVSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:mixedCSVView a rml:LogicalView ;
rml:viewOn :mixedCSVSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "item" ;
rml:reference "item" ;
rml:field [
a rml:IterableField ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$[*]" ;
rml:fieldName "itemJson" ;
rml:field [
a rml:ExpressionField;
rml:fieldName "type" ;
rml:reference "$.type" ; ] ;
rml:field [
a rml:ExpressionField;
rml:fieldName "weight" ;
rml:reference "$.weight" ;
] ;
] ;
] .
:triplesMapItem a rml:TriplesMap ;
rml:logicalSource :mixedCSVView ;
rml:subjectMap [
rml:template "http://example.org/item_{#}_{item.#}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasType ;
rml:objectMap [
rml:reference "item.itemJson.type" ;
] ;
] ;
rml:predicateObjectMap [
rml:predicate :hasWeight ;
rml:objectMap [
rml:reference "item.itemJson.weight" ;
rml:datatype xsd:integer ;
] ;
] .
Output
<http://example.org/item_0_0> <http://example.org/hasType> "sword" .
<http://example.org/item_0_0> <http://example.org/hasWeight> "1500"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/item_1_0> <http://example.org/hasType> "shield" .
<http://example.org/item_1_0> <http://example.org/hasWeight> "2500"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/item_2_0> <http://example.org/hasType> "flower" .
<http://example.org/item_2_0> <http://example.org/hasWeight> "15"^^<http://www.w3.org/2001/XMLSchema#integer> .
Title: Change Reference Formulations: JSON including CSV
Description: Test a change of reference formulations: json source including csv data
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": "type,weight\nsword,1500\nshield,2500"
},
{
"name": "bob",
"items": "type,weight\nflower,15"
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:mixedJSONSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:mixedJSONView a rml:LogicalView ;
rml:viewOn :mixedJSONSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "items" ;
rml:reference "$.items" ;
rml:field [
a rml:IterableField ;
rml:referenceFormulation rml:CSV ;
rml:fieldName "item";
rml:field [
a rml:ExpressionField ;
rml:fieldName "type" ;
rml:reference "type" ;
] ;
rml:field [
a rml:expressionField ;
rml:fieldName "weight" ;
rml:reference "weight" ;
] ;
] ;
].
:triplesMapItem a rml:TriplesMap ;
rml:logicalSource :mixedJSONView ;
rml:subjectMap [
rml:template "http://example.org/item_{#}_{items.item.#}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasType ;
rml:objectMap [
rml:reference "items.item.type" ;
] ;
] ;
rml:predicateObjectMap [
rml:predicate :hasWeight ;
rml:objectMap [
rml:reference "items.item.weight" ;
rml:datatype xsd:integer ;
] ;
] .
Output
<http://example.org/item_0_0> <http://example.org/hasType> "sword" .
<http://example.org/item_0_0> <http://example.org/hasWeight> "1500"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/item_0_1> <http://example.org/hasType> "shield" .
<http://example.org/item_0_1> <http://example.org/hasWeight> "2500"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/item_1_0> <http://example.org/hasType> "flower" .
<http://example.org/item_1_0> <http://example.org/hasWeight> "15"^^<http://www.w3.org/2001/XMLSchema#integer> .
Title: Cycle: Abstract Logical Source
Description: Test a cycle in the abstract logical source of a logical view
Error expected? Yes
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:view1 a rml:LogicalView ;
rml:viewOn :view2 ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name1" ;
rml:reference "name2" ;
] .
:view2 a rml:LogicalView ;
rml:viewOn :view1 ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name2" ;
rml:reference "name1" ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :view2 ;
rml:subjectMap [
rml:template "http://example.org/person/{name2}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasName ;
rml:objectMap [
rml:reference "name2" ;
] ;
] .
Title: Cycle: Joins
Description: Test a cycle in two joins of two logical views
Error expected? No
Input
{
"people": [
{
"name": "alice",
"items": [
"sword",
"shield"
]
},
{
"name": "bob",
"items": [
"flower"
]
}
]
}
Input 1
name,birthyear
alice,1995
bob,1999
tobias,2005
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "item" ;
rml:reference "$.items[*]" ;
] ;
rml:leftJoin [
rml:parentLogicalView :csvView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "csv_birthyear" ;
rml:reference "birthyear" ;
] ;
] .
:csvSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.csv" ;
] ;
rml:referenceFormulation rml:CSV .
:csvView a rml:LogicalView ;
rml:viewOn :csvSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "birthyear" ;
rml:reference "birthyear" ;
] ;
rml:leftJoin [
rml:parentLogicalView :jsonView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "json_item" ;
rml:reference "item" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :csvView ;
rml:subjectMap [
rml:template "http://example.org/person/{name}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasBirthYear ;
rml:objectMap [
rml:reference "birthyear" ;
rml:datatype xsd:gYear ;
] ;
] ;
rml:predicateObjectMap [
rml:predicate :hasItem ;
rml:objectMap [
rml:template "http://example.org/person/{name}/item/{json_item}" ;
] ;
] .
Output
<http://example.org/person/alice> <http://example.org/hasBirthYear> "1995"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/alice> <http://example.org/hasItem> <http://example.org/person/alice/item/sword> .
<http://example.org/person/alice> <http://example.org/hasItem> <http://example.org/person/alice/item/shield> .
<http://example.org/person/bob> <http://example.org/hasBirthYear> "1999"^^<http://www.w3.org/2001/XMLSchema#gYear> .
<http://example.org/person/bob> <http://example.org/hasItem> <http://example.org/person/bob/item/flower> .
<http://example.org/person/tobias> <http://example.org/hasBirthYear> "2005"^^<http://www.w3.org/2001/XMLSchema#gYear> .
Title: Cycle: Self-Join
Description: Test a cycle in a join of a logical view: self-join
Error expected? Yes
Input
{
"people": [
{
"name": "alice",
"items": [
{
"type": "sword",
"weight": 1500
},
{
"type": "shield",
"weight": 2500
}
]
},
{
"name": "bob",
"items": [
{
"type": "flower",
"weight": 15
}
]
}
]
}
Mapping
@prefix rml: <http://w3id.org/rml/> .
@prefix : <http://example.org/> .
:jsonSource a rml:LogicalSource ;
rml:source [
a rml:RelativePathSource , rml:Source ;
rml:root rml:MappingDirectory ;
rml:path "people.json" ;
] ;
rml:referenceFormulation rml:JSONPath ;
rml:iterator "$.people[*]" .
:jsonView a rml:LogicalView ;
rml:viewOn :jsonSource ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "name" ;
rml:reference "$.name" ;
] ;
rml:leftJoin [
rml:parentLogicalView :jsonView ;
rml:joinCondition [
rml:parent "name" ;
rml:child "name" ;
] ;
rml:field [
a rml:ExpressionField ;
rml:fieldName "newName" ;
rml:reference "name" ;
] ;
] .
:triplesMapPerson a rml:TriplesMap ;
rml:logicalSource :jsonView ;
rml:subjectMap [
rml:template "http://example.org/person/{newName}" ;
] ;
rml:predicateObjectMap [
rml:predicate :hasName ;
rml:objectMap [
rml:reference "newName" ;
] ;
] .