diff --git a/README.md b/README.md index 088b67f..bce07ce 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,6 @@ The tool translates mapping rules from YARRRML in a turtle-based serialization of RML or R2RML. The translation is based on the [RML](https://rml.io/specs/rml/) and [YARRRML](https://rml.io/yarrrml/spec/) specifications. -## Limitations -We are working on including the following features which are not yet implemented: -- Functions using the [FnO](https://fno.io/) Ontology - ## Installation: ``` pip install yarrrml-translator @@ -69,6 +65,17 @@ list_yarrrml_mappings = ["content_mapping_yarrrml1", "content_mapping_yarrrml1"] yarrrml_content = yarrrml_translator.merge_mappings(list_yarrrml_mappings) ``` + +## Specifications conformant: + +These are the following specifications used by the translation process: +- YARRRML: https://github.com/kg-construct/yarrrml-spec (Proper website soon) +- R2RML: https://www.w3.org/TR/r2rml/ +- RML: https://rml.io/spec +- RML-star: https://w3id.org/kg-construct/rml-star +- RML-Target: https://rml.io/specs/rml-target/ +- RML-FNML: https://kg-construct.github.io/fnml-spec/ + ## Authors Ontology Engineering Group: - [David Chaves-Fraga](mailto:david.chaves@upm.es) diff --git a/VERSION b/VERSION index 6f4eebd..100435b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.1 +0.8.2 diff --git a/test/projects/PPDSTC/test_ppds.py b/test/projects/PPDSTC/test_ppds.py index d477c73..84c1fbc 100644 --- a/test/projects/PPDSTC/test_ppds.py +++ b/test/projects/PPDSTC/test_ppds.py @@ -1,9 +1,10 @@ -__author__ = "Marino Gonzalez Garcia" -__credits__ = ["Marino Gonzalez Garcia"] +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" + import os @@ -14,7 +15,7 @@ RML_URI = 'http://semweb.mmlab.be/ns/rml#' -def test_yarrrmltc0019(): +def test_yarrrml_ppds(): expected_mapping = Graph() expected_mapping.parse(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.ttl'), format="ttl") diff --git a/test/r2rml/YARRRMLTC-0008/test_yarrrmltc0008.py b/test/r2rml/YARRRMLTC-0008/test_yarrrmltc0008.py index 0b79bc8..a837dd0 100644 --- a/test/r2rml/YARRRMLTC-0008/test_yarrrmltc0008.py +++ b/test/r2rml/YARRRMLTC-0008/test_yarrrmltc0008.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/r2rml/YARRRMLTC-0009/test_yarrrmltc0009.py b/test/r2rml/YARRRMLTC-0009/test_yarrrmltc0009.py index d162eaf..6261a97 100644 --- a/test/r2rml/YARRRMLTC-0009/test_yarrrmltc0009.py +++ b/test/r2rml/YARRRMLTC-0009/test_yarrrmltc0009.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/r2rml/YARRRMLTC-0010/test_yarrrmltc0010.py b/test/r2rml/YARRRMLTC-0010/test_yarrrmltc0010.py index 81b1951..373e597 100644 --- a/test/r2rml/YARRRMLTC-0010/test_yarrrmltc0010.py +++ b/test/r2rml/YARRRMLTC-0010/test_yarrrmltc0010.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/r2rml/YARRRMLTC-0011/test_yarrrmltc0011.py b/test/r2rml/YARRRMLTC-0011/test_yarrrmltc0011.py index 156f107..c90dffb 100644 --- a/test/r2rml/YARRRMLTC-0011/test_yarrrmltc0011.py +++ b/test/r2rml/YARRRMLTC-0011/test_yarrrmltc0011.py @@ -2,9 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" - +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os from ruamel.yaml import YAML diff --git a/test/r2rml/YARRRMLTC-0012/test_yarrrmltc0012.py b/test/r2rml/YARRRMLTC-0012/test_yarrrmltc0012.py index 4c671bc..628aad6 100644 --- a/test/r2rml/YARRRMLTC-0012/test_yarrrmltc0012.py +++ b/test/r2rml/YARRRMLTC-0012/test_yarrrmltc0012.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/r2rml/YARRRMLTC-0013/test_yarrrmltc0013.py b/test/r2rml/YARRRMLTC-0013/test_yarrrmltc0013.py index 32c75d4..040591a 100644 --- a/test/r2rml/YARRRMLTC-0013/test_yarrrmltc0013.py +++ b/test/r2rml/YARRRMLTC-0013/test_yarrrmltc0013.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/r2rml/YARRRMLTC-0014/test_yarrrmltc0014.py b/test/r2rml/YARRRMLTC-0014/test_yarrrmltc0014.py index feb0cf0..7dd07ac 100644 --- a/test/r2rml/YARRRMLTC-0014/test_yarrrmltc0014.py +++ b/test/r2rml/YARRRMLTC-0014/test_yarrrmltc0014.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/r2rml/YARRRMLTC-0015/test_yarrrmltc0015.py b/test/r2rml/YARRRMLTC-0015/test_yarrrmltc0015.py index 6106302..e90e6e5 100644 --- a/test/r2rml/YARRRMLTC-0015/test_yarrrmltc0015.py +++ b/test/r2rml/YARRRMLTC-0015/test_yarrrmltc0015.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-core/YARRRMLTC-0016/test_yarrrmltc0016.py b/test/rml-core/YARRRMLTC-0016/test_yarrrmltc0016.py index f8711a1..ca2fb5c 100644 --- a/test/rml-core/YARRRMLTC-0016/test_yarrrmltc0016.py +++ b/test/rml-core/YARRRMLTC-0016/test_yarrrmltc0016.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-core/YARRRMLTC-0017/test_yarrrmltc0017.py b/test/rml-core/YARRRMLTC-0017/test_yarrrmltc0017.py index 6f67dff..c21c23e 100644 --- a/test/rml-core/YARRRMLTC-0017/test_yarrrmltc0017.py +++ b/test/rml-core/YARRRMLTC-0017/test_yarrrmltc0017.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-core/YARRRMLTC-0018/test_yarrrmltc0018.py b/test/rml-core/YARRRMLTC-0018/test_yarrrmltc0018.py index 19c3510..5968be8 100644 --- a/test/rml-core/YARRRMLTC-0018/test_yarrrmltc0018.py +++ b/test/rml-core/YARRRMLTC-0018/test_yarrrmltc0018.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-core/YARRRMLTC-0019/test_yarrrmltc0019.py b/test/rml-core/YARRRMLTC-0019/test_yarrrmltc0019.py index d477c73..df754b2 100644 --- a/test/rml-core/YARRRMLTC-0019/test_yarrrmltc0019.py +++ b/test/rml-core/YARRRMLTC-0019/test_yarrrmltc0019.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-core/YARRRMLTC-0020/test_yarrrmltc0020.py b/test/rml-core/YARRRMLTC-0020/test_yarrrmltc0020.py index d3ccfe4..f616b84 100644 --- a/test/rml-core/YARRRMLTC-0020/test_yarrrmltc0020.py +++ b/test/rml-core/YARRRMLTC-0020/test_yarrrmltc0020.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-core/YARRRMLTC-0021/test_yarrrmltc0021.py b/test/rml-core/YARRRMLTC-0021/test_yarrrmltc0021.py index 44314cb..6790077 100644 --- a/test/rml-core/YARRRMLTC-0021/test_yarrrmltc0021.py +++ b/test/rml-core/YARRRMLTC-0021/test_yarrrmltc0021.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-core/YARRRMLTC-0022/test_yarrrmltc0022.py b/test/rml-core/YARRRMLTC-0022/test_yarrrmltc0022.py index 0c3b386..653dfb1 100644 --- a/test/rml-core/YARRRMLTC-0022/test_yarrrmltc0022.py +++ b/test/rml-core/YARRRMLTC-0022/test_yarrrmltc0022.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-datatype/YARRRMLTC-0032/test_yarrrmltc0032.py b/test/rml-datatype/YARRRMLTC-0032/test_yarrrmltc0032.py index f843d32..e4e106e 100644 --- a/test/rml-datatype/YARRRMLTC-0032/test_yarrrmltc0032.py +++ b/test/rml-datatype/YARRRMLTC-0032/test_yarrrmltc0032.py @@ -1,8 +1,8 @@ -__author__ = "Marino Gonzalez Garcia" -__credits__ = ["Marino Gonzalez Garcia"] +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] __license__ = "Apache-2.0" -__maintainer__ = "David Chaves Fraga" +__maintainer__ = "David Chaves-Fraga" __email__ = "david.chaves@upm.es" diff --git a/test/rml-datatype/YARRRMLTC-0033/test_yarrrmltc0033.py b/test/rml-datatype/YARRRMLTC-0033/test_yarrrmltc0033.py index 47fe5ad..0e9ac0b 100644 --- a/test/rml-datatype/YARRRMLTC-0033/test_yarrrmltc0033.py +++ b/test/rml-datatype/YARRRMLTC-0033/test_yarrrmltc0033.py @@ -1,8 +1,8 @@ -__author__ = "Marino Gonzalez Garcia" -__credits__ = ["Marino Gonzalez Garcia"] +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] __license__ = "Apache-2.0" -__maintainer__ = "David Chaves Fraga" +__maintainer__ = "David Chaves-Fraga" __email__ = "david.chaves@upm.es" diff --git a/test/rml-fnml/YARRRMLTC-0040/mapping.ttl b/test/rml-fnml/YARRRMLTC-0040/mapping.ttl new file mode 100644 index 0000000..926941b --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0040/mapping.ttl @@ -0,0 +1,53 @@ +@prefix foaf: . +@prefix ex: . +@prefix rr: . +@prefix rml: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix ql: . +@prefix d2rq: . +@prefix schema: . +@prefix formats: . +@prefix comp: . +@prefix void: . +@prefix fnml: . +@prefix grel: . +@base . + + + a fnml:Execution; + fnml:function ex:toLowerCase ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "firstname"; + ]; + ]. + + a rr:TriplesMap; + + rml:logicalSource [ + a rml:LogicalSource; + rml:source "student.csv"; + rml:referenceFormulation ql:CSV + ]; + rr:subjectMap [ + a rr:SubjectMap; + rr:template "http://example.com/{Name}"; + ]; + rr:predicateObjectMap [ + rr:predicateMap [ + a rr:PredicateMap; + rr:constant foaf:name; + ]; + rml:objectMap [ + a rr:ObjectMap; + fnml:execution ; + ]; + ]. + + diff --git a/test/rml-fnml/YARRRMLTC-0040/mapping.yml b/test/rml-fnml/YARRRMLTC-0040/mapping.yml new file mode 100644 index 0000000..d26b13d --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0040/mapping.yml @@ -0,0 +1,15 @@ +prefixes: + foaf: http://xmlns.com/foaf/0.1/ + ex: http://example.com/ + +mappings: + student2: + sources: + - [ 'student.csv~csv' ] + s: http://example.com/$(Name) + po: + - p: foaf:name + o: + - function: ex:toLowerCase + parameters: + - [ ex:input, $(firstname) ] \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0040/test_yarrrmltc0040.py b/test/rml-fnml/YARRRMLTC-0040/test_yarrrmltc0040.py new file mode 100644 index 0000000..df56d7d --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0040/test_yarrrmltc0040.py @@ -0,0 +1,25 @@ +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] + +__license__ = "Apache-2.0" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" + + +import os +from ruamel.yaml import YAML +import yarrrml_translator +from rdflib.graph import Graph +from rdflib import compare + + +def test_yarrrmltc0040(): + expected_mapping = Graph() + expected_mapping.parse(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.ttl'), format="ttl") + + translated_mapping = Graph() + yaml = YAML(typ='safe', pure=True) + mapping_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.yml') + translated_mapping.parse(data=yarrrml_translator.translate(yaml.load(open(mapping_path))), format="ttl") + + assert compare.isomorphic(expected_mapping, translated_mapping) \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0041/mapping.ttl b/test/rml-fnml/YARRRMLTC-0041/mapping.ttl new file mode 100644 index 0000000..7b05eb6 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0041/mapping.ttl @@ -0,0 +1,51 @@ +@prefix foaf: . +@prefix ex: . +@prefix rr: . +@prefix rml: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix ql: . +@prefix d2rq: . +@prefix schema: . +@prefix formats: . +@prefix comp: . +@prefix void: . +@prefix fnml: . +@prefix grel: . +@base . + + + a fnml:Execution; + fnml:function ex:toLowerCase ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "firstname"; + ]; + ]. + + a rr:TriplesMap; + + rml:logicalSource [ + a rml:LogicalSource; + rml:source "student.csv"; + rml:referenceFormulation ql:CSV + ]; + rr:subjectMap [ + a rr:SubjectMap; + fnml:execution ; + ]; + rr:predicateObjectMap [ + rr:predicateMap [ + a rr:PredicateMap; + rr:constant foaf:firstName; + ]; + rr:objectMap [ + a rr:ObjectMap; + rml:reference "name"; + ]; + ]. \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0041/mapping.yml b/test/rml-fnml/YARRRMLTC-0041/mapping.yml new file mode 100644 index 0000000..50e68f7 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0041/mapping.yml @@ -0,0 +1,14 @@ +prefixes: + foaf: http://xmlns.com/foaf/0.1/ + ex: http://example.com/ + +mappings: + student2: + sources: + - [ 'student.csv~csv' ] + s: + function: ex:toLowerCase + parameters: + - [ ex:input, $(firstname) ] + po: + - [foaf:firstName, $(name)] \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0041/test_yarrrmltc0041.py b/test/rml-fnml/YARRRMLTC-0041/test_yarrrmltc0041.py new file mode 100644 index 0000000..a03b2d7 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0041/test_yarrrmltc0041.py @@ -0,0 +1,25 @@ +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] + +__license__ = "Apache-2.0" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" + + +import os +from ruamel.yaml import YAML +import yarrrml_translator +from rdflib.graph import Graph +from rdflib import compare + + +def test_yarrrmltc0041(): + expected_mapping = Graph() + expected_mapping.parse(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.ttl'), format="ttl") + + translated_mapping = Graph() + yaml = YAML(typ='safe', pure=True) + mapping_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.yml') + translated_mapping.parse(data=yarrrml_translator.translate(yaml.load(open(mapping_path))), format="ttl") + + assert compare.isomorphic(expected_mapping, translated_mapping) \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0042/mapping.ttl b/test/rml-fnml/YARRRMLTC-0042/mapping.ttl new file mode 100644 index 0000000..b20cb4b --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0042/mapping.ttl @@ -0,0 +1,64 @@ +@prefix foaf: . +@prefix ex: . +@prefix rr: . +@prefix rml: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix ql: . +@prefix d2rq: . +@prefix schema: . +@prefix formats: . +@prefix comp: . +@prefix void: . +@prefix fnml: . +@prefix grel: . +@base . + + + a fnml:Execution; + fnml:function ex:toLowerCase ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:valueParameter; + fnml:valueMap[ + fnml:execution ; + ]; + ]. + + a fnml:Execution; + fnml:function ex:toUpperCase ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:valueParameter; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "name"; + ]; + ]. + + a rr:TriplesMap; + + rml:logicalSource [ + a rml:LogicalSource; + rml:source "student.csv"; + rml:referenceFormulation ql:CSV + ]; + rr:subjectMap [ + a rr:SubjectMap; + rr:template "http://example.com/{Name}"; + ]; + rr:predicateObjectMap [ + rr:predicateMap [ + a rr:PredicateMap; + rr:constant foaf:name; + ]; + rml:objectMap [ + a rr:ObjectMap; + fnml:execution ; + ]; + ]. + + diff --git a/test/rml-fnml/YARRRMLTC-0042/mapping.yml b/test/rml-fnml/YARRRMLTC-0042/mapping.yml new file mode 100644 index 0000000..dd44483 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0042/mapping.yml @@ -0,0 +1,19 @@ +prefixes: + foaf: http://xmlns.com/foaf/0.1/ + ex: http://example.com/ + +mappings: + student2: + sources: + - [ 'student.csv~csv' ] + s: http://example.com/$(Name) + po: + - p: foaf:name + o: + - function: ex:toLowerCase + parameters: + - parameter: ex:valueParameter + value: + function: ex:toUpperCase + parameters: + - [ ex:valueParameter, $(name) ] \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0042/test_yarrrmltc0042.py b/test/rml-fnml/YARRRMLTC-0042/test_yarrrmltc0042.py new file mode 100644 index 0000000..28ea419 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0042/test_yarrrmltc0042.py @@ -0,0 +1,25 @@ +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] + +__license__ = "Apache-2.0" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" + + +import os +from ruamel.yaml import YAML +import yarrrml_translator +from rdflib.graph import Graph +from rdflib import compare + + +def test_yarrrmltc0042(): + expected_mapping = Graph() + expected_mapping.parse(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.ttl'), format="ttl") + + translated_mapping = Graph() + yaml = YAML(typ='safe', pure=True) + mapping_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.yml') + translated_mapping.parse(data=yarrrml_translator.translate(yaml.load(open(mapping_path))), format="ttl") + + assert compare.isomorphic(expected_mapping, translated_mapping) \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0043/mapping.ttl b/test/rml-fnml/YARRRMLTC-0043/mapping.ttl new file mode 100644 index 0000000..ff63d70 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0043/mapping.ttl @@ -0,0 +1,75 @@ +@prefix foaf: . +@prefix ex: . +@prefix rr: . +@prefix rml: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix ql: . +@prefix d2rq: . +@prefix schema: . +@prefix formats: . +@prefix comp: . +@prefix void: . +@prefix fnml: . +@prefix grel: . +@base . + + + a fnml:Execution; + fnml:function ex:toLowerCase ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "firstname"; + ]; + ]. + + a fnml:Execution; + fnml:function ex:toLowerCase ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "surname"; + ]; + ]. + + a rr:TriplesMap; + + rml:logicalSource [ + a rml:LogicalSource; + rml:source "student.csv"; + rml:referenceFormulation ql:CSV + ]; + rr:subjectMap [ + a rr:SubjectMap; + rr:template "http://example.com/{Name}"; + ]; + rr:predicateObjectMap [ + rr:predicateMap [ + a rr:PredicateMap; + rr:constant foaf:name; + ]; + rml:objectMap [ + a rr:ObjectMap; + fnml:execution ; + ]; + ]; + rr:predicateObjectMap [ + rr:predicateMap [ + a rr:PredicateMap; + rr:constant foaf:surname; + ]; + rml:objectMap [ + a rr:ObjectMap; + fnml:execution ; + ]; + ]. + + diff --git a/test/rml-fnml/YARRRMLTC-0043/mapping.yml b/test/rml-fnml/YARRRMLTC-0043/mapping.yml new file mode 100644 index 0000000..0868905 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0043/mapping.yml @@ -0,0 +1,20 @@ +prefixes: + foaf: http://xmlns.com/foaf/0.1/ + ex: http://example.com/ + +mappings: + student2: + sources: + - [ 'student.csv~csv' ] + s: http://example.com/$(Name) + po: + - p: foaf:name + o: + - function: ex:toLowerCase + parameters: + - [ ex:input, $(firstname) ] + - p: foaf:surname + o: + - function: ex:toLowerCase + parameters: + - [ ex:input, $(surname) ] diff --git a/test/rml-fnml/YARRRMLTC-0043/test_yarrrmltc0043.py b/test/rml-fnml/YARRRMLTC-0043/test_yarrrmltc0043.py new file mode 100644 index 0000000..d74f38f --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0043/test_yarrrmltc0043.py @@ -0,0 +1,25 @@ +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] + +__license__ = "Apache-2.0" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" + + +import os +from ruamel.yaml import YAML +import yarrrml_translator +from rdflib.graph import Graph +from rdflib import compare + + +def test_yarrrmltc0043(): + expected_mapping = Graph() + expected_mapping.parse(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.ttl'), format="ttl") + + translated_mapping = Graph() + yaml = YAML(typ='safe', pure=True) + mapping_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.yml') + translated_mapping.parse(data=yarrrml_translator.translate(yaml.load(open(mapping_path))), format="ttl") + + assert compare.isomorphic(expected_mapping, translated_mapping) \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0044/mapping.ttl b/test/rml-fnml/YARRRMLTC-0044/mapping.ttl new file mode 100644 index 0000000..c0a1ab2 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0044/mapping.ttl @@ -0,0 +1,72 @@ +@prefix foaf: . +@prefix ex: . +@prefix rr: . +@prefix rml: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix ql: . +@prefix d2rq: . +@prefix schema: . +@prefix formats: . +@prefix comp: . +@prefix void: . +@prefix fnml: . +@prefix grel: . +@base . + + + a fnml:Execution; + fnml:function ex:function1 ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "firstname"; + ]; + ], + [ + a fnml:Input; + fnml:parameter ex:input2; + fnml:valueMap[ + fnml:execution ; + ]; + ]. + + a fnml:Execution; + fnml:function ex:lowerCase ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "name"; + ]; + ]. + + a rr:TriplesMap; + + rml:logicalSource [ + a rml:LogicalSource; + rml:source "student.csv"; + rml:referenceFormulation ql:CSV + ]; + rr:subjectMap [ + a rr:SubjectMap; + rr:template "http://example.com/{Name}"; + ]; + rr:predicateObjectMap [ + rr:predicateMap [ + a rr:PredicateMap; + rr:constant foaf:firstName; + ]; + rml:objectMap [ + a rr:ObjectMap; + fnml:execution ; + ]; + ]. + + diff --git a/test/rml-fnml/YARRRMLTC-0044/mapping.yml b/test/rml-fnml/YARRRMLTC-0044/mapping.yml new file mode 100644 index 0000000..f9efb61 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0044/mapping.yml @@ -0,0 +1,13 @@ +prefixes: + foaf: http://xmlns.com/foaf/0.1/ + ex: http://example.com/ + +mappings: + student2: + sources: + - [ 'student.csv~csv' ] + s: http://example.com/$(Name) + po: + - p: foaf:firstName + o: + - function: ex:function1(ex:input = $(firstname), ex:input2=ex:lowerCase(ex:input=$(name))) \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0044/test_yarrrmltc0044.py b/test/rml-fnml/YARRRMLTC-0044/test_yarrrmltc0044.py new file mode 100644 index 0000000..4201234 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0044/test_yarrrmltc0044.py @@ -0,0 +1,25 @@ +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] + +__license__ = "Apache-2.0" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" + + +import os +from ruamel.yaml import YAML +import yarrrml_translator +from rdflib.graph import Graph +from rdflib import compare + + +def test_yarrrmltc0044(): + expected_mapping = Graph() + expected_mapping.parse(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.ttl'), format="ttl") + + translated_mapping = Graph() + yaml = YAML(typ='safe', pure=True) + mapping_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.yml') + translated_mapping.parse(data=yarrrml_translator.translate(yaml.load(open(mapping_path))), format="ttl") + + assert compare.isomorphic(expected_mapping, translated_mapping) \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0045/mapping.ttl b/test/rml-fnml/YARRRMLTC-0045/mapping.ttl new file mode 100644 index 0000000..f571340 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0045/mapping.ttl @@ -0,0 +1,91 @@ +@prefix foaf: . +@prefix ex: . +@prefix rr: . +@prefix rml: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix ql: . +@prefix d2rq: . +@prefix schema: . +@prefix formats: . +@prefix comp: . +@prefix void: . +@prefix fnml: . +@prefix grel: . +@base . + + + a fnml:Execution; + fnml:function ex:function1 ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input1; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "firstname1"; + ]; + ], + [ + a fnml:Input; + fnml:parameter ex:input2; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "firstname2"; + ]; + ], + [ + a fnml:Input; + fnml:parameter ex:input3; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "firstname3"; + ]; + ]. + + a fnml:Execution; + fnml:function ex:toLowerCase ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "surname"; + ]; + ]. + + a rr:TriplesMap; + + rml:logicalSource [ + a rml:LogicalSource; + rml:source "student.csv"; + rml:referenceFormulation ql:CSV + ]; + rr:subjectMap [ + a rr:SubjectMap; + rr:template "http://example.com/{Name}"; + ]; + rr:predicateObjectMap [ + rr:predicateMap [ + a rr:PredicateMap; + rr:constant foaf:name; + ]; + rml:objectMap [ + a rr:ObjectMap; + fnml:execution ; + ]; + ]; + rr:predicateObjectMap [ + rr:predicateMap [ + a rr:PredicateMap; + rr:constant foaf:surname; + ]; + rml:objectMap [ + a rr:ObjectMap; + fnml:execution ; + ]; + ]. + + diff --git a/test/rml-fnml/YARRRMLTC-0045/mapping.yml b/test/rml-fnml/YARRRMLTC-0045/mapping.yml new file mode 100644 index 0000000..0dd6aa7 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0045/mapping.yml @@ -0,0 +1,22 @@ +prefixes: + foaf: http://xmlns.com/foaf/0.1/ + ex: http://example.com/ + +mappings: + student2: + sources: + - [ 'student.csv~csv' ] + s: http://example.com/$(Name) + po: + - p: foaf:name + o: + - function: ex:function1 + parameters: + - [ ex:input1, $(firstname1) ] + - [ ex:input2, $(firstname2) ] + - [ ex:input3, $(firstname3) ] + - p: foaf:surname + o: + - function: ex:toLowerCase + parameters: + - [ ex:input, $(surname) ] \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0045/test_yarrrmltc0045.py b/test/rml-fnml/YARRRMLTC-0045/test_yarrrmltc0045.py new file mode 100644 index 0000000..551f982 --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0045/test_yarrrmltc0045.py @@ -0,0 +1,25 @@ +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] + +__license__ = "Apache-2.0" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" + + +import os +from ruamel.yaml import YAML +import yarrrml_translator +from rdflib.graph import Graph +from rdflib import compare + + +def test_yarrrmltc0045(): + expected_mapping = Graph() + expected_mapping.parse(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.ttl'), format="ttl") + + translated_mapping = Graph() + yaml = YAML(typ='safe', pure=True) + mapping_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.yml') + translated_mapping.parse(data=yarrrml_translator.translate(yaml.load(open(mapping_path))), format="ttl") + + assert compare.isomorphic(expected_mapping, translated_mapping) \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0046/mapping.ttl b/test/rml-fnml/YARRRMLTC-0046/mapping.ttl new file mode 100644 index 0000000..774468e --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0046/mapping.ttl @@ -0,0 +1,135 @@ +@prefix foaf: . +@prefix ex: . +@prefix rr: . +@prefix rml: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix ql: . +@prefix d2rq: . +@prefix schema: . +@prefix formats: . +@prefix comp: . +@prefix void: . +@prefix fnml: . +@prefix grel: . +@base . + + + a fnml:Execution; + fnml:function ex:function0 ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "firstname"; + ]; + ], + [ + a fnml:Input; + fnml:parameter ex:input2; + fnml:valueMap[ + fnml:execution ; + ]; + ]. + + a fnml:Execution; + fnml:function ex:lowerCase ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "name"; + ]; + ]. + + a fnml:Execution; + fnml:function ex:function1 ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "name"; + ]; + ], + [ + a fnml:Input; + fnml:parameter ex:valueParameter; + fnml:valueMap[ + fnml:execution ; + ]; + ]. + + a fnml:Execution; + fnml:function ex:toUpperCase ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:valueParameter; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "firstname"; + ]; + ]. + + a fnml:Execution; + fnml:function ex:function2 ; + fnml:input + [ + a fnml:Input; + fnml:parameter ex:input; + fnml:valueMap [ + a fnml:ValueMap; + rml:reference "surname"; + ]; + ]. + + a rr:TriplesMap; + + rml:logicalSource [ + a rml:LogicalSource; + rml:source "student.csv"; + rml:referenceFormulation ql:CSV + ]; + rr:subjectMap [ + a rr:SubjectMap; + rr:template "http://example.com/{Name}"; + ]; + rr:predicateObjectMap [ + rr:predicateMap [ + a rr:PredicateMap; + rr:constant foaf:firstName; + ]; + rml:objectMap [ + a rr:ObjectMap; + fnml:execution ; + ]; + ]; + rr:predicateObjectMap [ + rr:predicateMap [ + a rr:PredicateMap; + rr:constant foaf:name; + ]; + rml:objectMap [ + a rr:ObjectMap; + fnml:execution ; + ]; + ]; + rr:predicateObjectMap [ + rr:predicateMap [ + a rr:PredicateMap; + rr:constant foaf:surname; + ]; + rml:objectMap [ + a rr:ObjectMap; + fnml:execution ; + ]; + ]. + + diff --git a/test/rml-fnml/YARRRMLTC-0046/mapping.yml b/test/rml-fnml/YARRRMLTC-0046/mapping.yml new file mode 100644 index 0000000..dafaddb --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0046/mapping.yml @@ -0,0 +1,28 @@ +prefixes: + foaf: http://xmlns.com/foaf/0.1/ + ex: http://example.com/ + +mappings: + student2: + sources: + - [ 'student.csv~csv' ] + s: http://example.com/$(Name) + po: + - p: foaf:firstName + o: + - function: ex:function0(ex:input = $(firstname), ex:input2=ex:lowerCase(ex:input=$(name))) + - p: foaf:name + o: + - function: ex:function1 + parameters: + - [ ex:input, $(name) ] + - parameter: ex:valueParameter + value: + function: ex:toUpperCase + parameters: + - [ ex:valueParameter, $(firstname) ] + - p: foaf:surname + o: + - function: ex:function2 + parameters: + - [ ex:input, $(surname) ] \ No newline at end of file diff --git a/test/rml-fnml/YARRRMLTC-0046/test_yarrrmltc0046.py b/test/rml-fnml/YARRRMLTC-0046/test_yarrrmltc0046.py new file mode 100644 index 0000000..f7a90ce --- /dev/null +++ b/test/rml-fnml/YARRRMLTC-0046/test_yarrrmltc0046.py @@ -0,0 +1,25 @@ +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] + +__license__ = "Apache-2.0" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" + + +import os +from ruamel.yaml import YAML +import yarrrml_translator +from rdflib.graph import Graph +from rdflib import compare + + +def test_yarrrmltc0046(): + expected_mapping = Graph() + expected_mapping.parse(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.ttl'), format="ttl") + + translated_mapping = Graph() + yaml = YAML(typ='safe', pure=True) + mapping_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'mapping.yml') + translated_mapping.parse(data=yarrrml_translator.translate(yaml.load(open(mapping_path))), format="ttl") + + assert compare.isomorphic(expected_mapping, translated_mapping) \ No newline at end of file diff --git a/test/rml-language/YARRRMLTC-0030/test_yarrrmltc0030.py b/test/rml-language/YARRRMLTC-0030/test_yarrrmltc0030.py index 2d9ef55..4e46fb8 100644 --- a/test/rml-language/YARRRMLTC-0030/test_yarrrmltc0030.py +++ b/test/rml-language/YARRRMLTC-0030/test_yarrrmltc0030.py @@ -1,8 +1,8 @@ -__author__ = "Marino Gonzalez Garcia" -__credits__ = ["Marino Gonzalez Garcia"] +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] __license__ = "Apache-2.0" -__maintainer__ = "David Chaves Fraga" +__maintainer__ = "David Chaves-Fraga" __email__ = "david.chaves@upm.es" diff --git a/test/rml-language/YARRRMLTC-0031/test_yarrrmltc0031.py b/test/rml-language/YARRRMLTC-0031/test_yarrrmltc0031.py index bae6de4..e94124b 100644 --- a/test/rml-language/YARRRMLTC-0031/test_yarrrmltc0031.py +++ b/test/rml-language/YARRRMLTC-0031/test_yarrrmltc0031.py @@ -1,11 +1,10 @@ -__author__ = "Marino Gonzalez Garcia" -__credits__ = ["Marino Gonzalez Garcia"] +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] __license__ = "Apache-2.0" -__maintainer__ = "David Chaves Fraga" +__maintainer__ = "David Chaves-Fraga" __email__ = "david.chaves@upm.es" - import os from ruamel.yaml import YAML import yarrrml_translator diff --git a/test/rml-star/YARRRMLTC-0024/test_yarrrmltc0024.py b/test/rml-star/YARRRMLTC-0024/test_yarrrmltc0024.py index 5bbd277..b6ec7d7 100644 --- a/test/rml-star/YARRRMLTC-0024/test_yarrrmltc0024.py +++ b/test/rml-star/YARRRMLTC-0024/test_yarrrmltc0024.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-star/YARRRMLTC-0025/test_yarrrmltc0025.py b/test/rml-star/YARRRMLTC-0025/test_yarrrmltc0025.py index 58837e6..fe38c79 100644 --- a/test/rml-star/YARRRMLTC-0025/test_yarrrmltc0025.py +++ b/test/rml-star/YARRRMLTC-0025/test_yarrrmltc0025.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-star/YARRRMLTC-0026/test_yarrrmltc0026.py b/test/rml-star/YARRRMLTC-0026/test_yarrrmltc0026.py index aa093c6..63fdd60 100644 --- a/test/rml-star/YARRRMLTC-0026/test_yarrrmltc0026.py +++ b/test/rml-star/YARRRMLTC-0026/test_yarrrmltc0026.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-star/YARRRMLTC-0027/test_yarrrmltc0027.py b/test/rml-star/YARRRMLTC-0027/test_yarrrmltc0027.py index d7188f0..80cf527 100644 --- a/test/rml-star/YARRRMLTC-0027/test_yarrrmltc0027.py +++ b/test/rml-star/YARRRMLTC-0027/test_yarrrmltc0027.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-star/YARRRMLTC-0028/test_yarrrmltc0028.py b/test/rml-star/YARRRMLTC-0028/test_yarrrmltc0028.py index 5acbbed..96fdeb6 100644 --- a/test/rml-star/YARRRMLTC-0028/test_yarrrmltc0028.py +++ b/test/rml-star/YARRRMLTC-0028/test_yarrrmltc0028.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-star/YARRRMLTC-0029/test_yarrrmltc0029.py b/test/rml-star/YARRRMLTC-0029/test_yarrrmltc0029.py index d8f325c..757499d 100644 --- a/test/rml-star/YARRRMLTC-0029/test_yarrrmltc0029.py +++ b/test/rml-star/YARRRMLTC-0029/test_yarrrmltc0029.py @@ -2,8 +2,8 @@ __credits__ = ["Marino Gonzalez Garcia"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-target/YARRRMLTC-0034/test_yarrrmltc0034.py b/test/rml-target/YARRRMLTC-0034/test_yarrrmltc0034.py index dc46f4b..00b2960 100644 --- a/test/rml-target/YARRRMLTC-0034/test_yarrrmltc0034.py +++ b/test/rml-target/YARRRMLTC-0034/test_yarrrmltc0034.py @@ -1,9 +1,9 @@ -__author__ = "Marino Gonzalez Garcia" -__credits__ = ["Marino Gonzalez Garcia"] +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-target/YARRRMLTC-0035/test_yarrrmltc0035.py b/test/rml-target/YARRRMLTC-0035/test_yarrrmltc0035.py index 14503be..a7fd3af 100644 --- a/test/rml-target/YARRRMLTC-0035/test_yarrrmltc0035.py +++ b/test/rml-target/YARRRMLTC-0035/test_yarrrmltc0035.py @@ -1,9 +1,9 @@ -__author__ = "Marino Gonzalez Garcia" -__credits__ = ["Marino Gonzalez Garcia"] +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-target/YARRRMLTC-0036/test_yarrrmltc0036.py b/test/rml-target/YARRRMLTC-0036/test_yarrrmltc0036.py index 4ce4c7d..857cbb8 100644 --- a/test/rml-target/YARRRMLTC-0036/test_yarrrmltc0036.py +++ b/test/rml-target/YARRRMLTC-0036/test_yarrrmltc0036.py @@ -1,9 +1,9 @@ -__author__ = "Marino Gonzalez Garcia" -__credits__ = ["Marino Gonzalez Garcia"] +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-target/YARRRMLTC-0037/test_yarrrmltc0037.py b/test/rml-target/YARRRMLTC-0037/test_yarrrmltc0037.py index 4c23f4b..331929b 100644 --- a/test/rml-target/YARRRMLTC-0037/test_yarrrmltc0037.py +++ b/test/rml-target/YARRRMLTC-0037/test_yarrrmltc0037.py @@ -1,9 +1,9 @@ -__author__ = "Marino Gonzalez Garcia" -__credits__ = ["Marino Gonzalez Garcia"] +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-target/YARRRMLTC-0038/test_yarrrmltc0038.py b/test/rml-target/YARRRMLTC-0038/test_yarrrmltc0038.py index 1c47170..4e7e02a 100644 --- a/test/rml-target/YARRRMLTC-0038/test_yarrrmltc0038.py +++ b/test/rml-target/YARRRMLTC-0038/test_yarrrmltc0038.py @@ -1,9 +1,9 @@ -__author__ = "Marino Gonzalez Garcia" -__credits__ = ["Marino Gonzalez Garcia"] +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/test/rml-target/YARRRMLTC-0039/test_yarrrmltc0039.py b/test/rml-target/YARRRMLTC-0039/test_yarrrmltc0039.py index 5336e95..a088637 100644 --- a/test/rml-target/YARRRMLTC-0039/test_yarrrmltc0039.py +++ b/test/rml-target/YARRRMLTC-0039/test_yarrrmltc0039.py @@ -1,9 +1,9 @@ -__author__ = "Marino Gonzalez Garcia" -__credits__ = ["Marino Gonzalez Garcia"] +__author__ = "David Chaves-Fraga" +__credits__ = ["David Chaves-Fraga"] __license__ = "Apache-2.0" -__maintainer__ = "Marino Gonzalez Garcia" -__email__ = "marino.gonzalez.garcia@alumnos.upm.es" +__maintainer__ = "David Chaves-Fraga" +__email__ = "david.chaves@upm.es" import os diff --git a/yarrrml-translator/yarrrml_translator/__init__.py b/yarrrml-translator/yarrrml_translator/__init__.py index f03c53d..7aefcc2 100644 --- a/yarrrml-translator/yarrrml_translator/__init__.py +++ b/yarrrml-translator/yarrrml_translator/__init__.py @@ -1,8 +1,10 @@ from .constants import * -from .mapping import add_prefix, add_mapping, add_inverse_prefix, get_non_asserted_mappings, merge_mapping_section_by_key, add_logical_targets +from .mapping import add_prefix, add_mapping, add_inverse_prefix, get_non_asserted_mappings, merge_mapping_section_by_key from .source import get_initial_sources, add_source, generate_database_connections, add_table, add_inverse_source from .subject import add_subject, add_inverse_subject from .predicateobject import add_predicate_object_maps, add_inverse_pom +from .target import add_logical_targets +from .function import add_functions import rdflib import ruamel.yaml as yaml @@ -14,10 +16,10 @@ def translate(yarrrml_data, mapping_format=RML_URI): rml_mapping = [add_prefix(yarrrml_data)] rml_mapping.extend(generate_database_connections(yarrrml_data, list_initial_sources)) rml_mapping.extend(add_logical_targets(yarrrml_data)) + rml_mapping.extend(add_functions(yarrrml_data)) try: mappings, mapping_format = get_non_asserted_mappings(yarrrml_data, mapping_format) for mapping in yarrrml_data.get(YARRRML_MAPPINGS): - print(mapping) if mapping_format == R2RML_URI: source_list = add_table(yarrrml_data, mapping, list_initial_sources) else: @@ -69,8 +71,8 @@ def inverse_translation(rdf_mapping, mapping_format=RML_URI): for tm in triples_map: tm_name = tm.split("/")[-1] yarrrml_tm = {YARRRML_SOURCE: add_inverse_source(tm, rdf_mapping, mapping_format)} - yarrrml_tm[YARRRML_SHORTCUT_SUBJECTS], classes = add_inverse_subject(tm, rdf_mapping) - yarrrml_tm[YARRRML_SHORTCUT_PREDICATEOBJECT] = add_inverse_pom(tm, rdf_mapping, classes, yarrrml_mapping[YARRRML_PREFIXES]) + yarrrml_tm[YARRRML_SUBJECTS_SHORTCUT], classes = add_inverse_subject(tm, rdf_mapping) + yarrrml_tm[YARRRML_PREDICATEOBJECT_SHORTCUT] = add_inverse_pom(tm, rdf_mapping, classes, yarrrml_mapping[YARRRML_PREFIXES]) yarrrml_mapping[YARRRML_MAPPINGS][tm_name] = yarrrml_tm string_content = yaml.dump(yarrrml_mapping) diff --git a/yarrrml-translator/yarrrml_translator/constants.py b/yarrrml-translator/yarrrml_translator/constants.py index 609f3e9..5773722 100644 --- a/yarrrml-translator/yarrrml_translator/constants.py +++ b/yarrrml-translator/yarrrml_translator/constants.py @@ -19,6 +19,8 @@ COMPRESSION_URI = 'http://semweb.mmlab.be/ns/rml-compression#' FORMATS_URI = 'http://www.w3.org/ns/formats/' VOID_URI = 'http://rdfs.org/ns/void#' +FNML_URI = 'http://semweb.mmlab.be/ns/fnml#' +GREL_URI = 'http://users.ugent.be/~bjdmeest/function/grel.ttl#' RML_PREFIX = '@prefix' RML_BASE = '@base' @@ -33,12 +35,23 @@ RML_DATATYPE_MAP = 'rml:datatypeMap' RML_DATATYPE_MAP_CLASS = 'rml:DatatypeMap' RML_QUERY = 'rml:query' + RML_LOGICAL_TARGET = 'rml:logicalTarget' RML_LOGICAL_TARGET_CLASS = 'rml:LogicalTarget' RML_TARGET = 'rml:target' RML_SERIALIZATION = 'rml:serialization' RML_COMPRESSION = 'rml:compression' +RML_EXECUTION = 'fnml:execution' +RML_EXECUTION_CLASS = 'fnml:Execution' +RML_RETURN = 'fnml:return' +RML_FUNCTION = 'fnml:function' +RML_INPUT = 'fnml:input' +RML_INPUT_CLASS = 'fnml:Input' +RML_PARAMETER = 'fnml:parameter' +RML_VALUE_MAP = 'fnml:valueMap' +RML_VALUE_MAP_CLASS = 'fnml:ValueMap' + STAR_CLASS = 'rml:StarMap' STAR_NON_ASSERTED_CLASS = 'rml:NonAssertedTriplesMap' STAR_QUOTED = 'rml:quotedTriplesMap' @@ -93,7 +106,6 @@ ############################################################################## YARRRML_PREFIXES = 'prefixes' -YARRRML_MAPPINGS = 'mappings' YARRRML_SOURCES = 'sources' YARRRML_SOURCE = 'source' YARRRML_TABLE = 'table' @@ -107,35 +119,39 @@ YARRRML_USERNAME = 'username' YARRRML_PASSWORD = 'password' -YARRRML_SHORTCUT_SUBJECTS = 's' +YARRRML_MAPPINGS = 'mappings' # used for mappings in conditions and mappings main key +YARRRML_MAPPING = 'mapping' +YARRRRL_MAPPINGS_SHORTCUT = 'm' + +YARRRML_SUBJECTS_SHORTCUT = 's' YARRRML_SUBJECT = 'subject' YARRRML_SUBJECTS = 'subjects' YARRRML_GRAPHS = 'graphs' YARRRML_GRAPH = 'graph' -YARRRML_SHORTCUT_GRAPH = 'g' +YARRRML_GRAPH_SHORTCUT = 'g' YARRRML_PREDICATEOBJECT = 'predicateobjects' -YARRRML_SHORTCUT_PREDICATEOBJECT = 'po' +YARRRML_PREDICATEOBJECT_SHORTCUT = 'po' YARRRML_PREDICATES = 'predicates' YARRRML_PREDICATE = 'predicate' -YARRRML_SHORTCUT_PREDICATES = 'p' +YARRRML_PREDICATES_SHORTCUT = 'p' YARRRML_OBJECTS = 'objects' YARRRML_OBJECT = 'objects' -YARRRML_SHORTCUT_OBJECT = 'o' +YARRRML_OBJECT_SHORTCUT = 'o' YARRRML_VALUE = 'value' -YARRRML_MAPPING = 'mapping' +YARRRML_VALUE_SHORTCUT = 'v' YARRRML_DATATYPE = 'datatype' YARRRML_LANGUAGE = 'language' YARRRML_CONDITION = 'condition' -YARRRML_PARAMETERS = 'parameters' +YARRRML_PARAMETERS = 'parameters' #used for conditions and functions +YARRRML_PARAMETERS_SHORTCUT = 'pms' YARRRML_IRI = '~iri' YARRRML_LANG = '~lang' - YARRRML_QUOTED = 'quoted' YARRRML_NON_ASSERTED = 'quotedNonAsserted' @@ -143,10 +159,24 @@ YARRRML_SERIALIZATION = 'serialization' YARRRML_COMPRESSION = 'compression' +YARRRML_FUNCTION = 'function' +YARRRML_FUNCTION_SHORTCUT_A = 'fn' +YARRRML_FUNCTION_SHORTCUT_B = 'f' + +YARRRML_PARAMETER = 'parameter' +YARRRML_PARAMETER_SHORTCUT = 'p' + +YARRRML_MAPPING_KEYS = [YARRRML_MAPPINGS, YARRRML_MAPPING, YARRRRL_MAPPINGS_SHORTCUT] +YARRRML_SUBJECT_KEYS = [YARRRML_SUBJECTS, YARRRML_SUBJECT, YARRRML_SUBJECTS_SHORTCUT] +YARRRML_POM_KEYS = [YARRRML_PREDICATEOBJECT, YARRRML_PREDICATEOBJECT_SHORTCUT] +YARRRML_GRAPH_KEYS = [YARRRML_GRAPHS, YARRRML_GRAPH, YARRRML_GRAPH_SHORTCUT] +YARRRML_PREDICATE_KEYS = [YARRRML_PREDICATES, YARRRML_PREDICATE, YARRRML_PREDICATES_SHORTCUT] +YARRRML_OBJECT_KEYS = [YARRRML_OBJECTS, YARRRML_OBJECT, YARRRML_OBJECT_SHORTCUT] +YARRRML_FUNCTION_KEYS = [YARRRML_FUNCTION, YARRRML_FUNCTION_SHORTCUT_A, YARRRML_FUNCTION_SHORTCUT_B] +YARRRML_PARAMETERS_KEYS = [YARRRML_PARAMETERS, YARRRML_PARAMETERS_SHORTCUT] +YARRRML_PARAMETER_KEYS = [YARRRML_PARAMETER, YARRRML_PARAMETER_SHORTCUT] +YARRRML_VALUE_KEYS = [YARRRML_VALUE, YARRRML_VALUE_SHORTCUT] -############################################################################## -####################### YARRRML SERIALIZATION FORMATS ##################### -############################################################################## YARRRML_OUTPUT_FORMAT = { 'jsonld':'JSON-LD', @@ -174,5 +204,18 @@ 'trig':'TriG', } +YARRRML_REFERENCE_FORMULATIONS = { + 'csv': 'CSV', + 'json': 'JSONPath', + 'xpath': 'XPath', + 'jsonpath': 'JSONPath' +} + +YARRRML_DATABASES_DRIVER = { + 'mysql': 'com.mysql.jdbc.Driver', + 'postgresql': 'org.postgresql.Driver', + 'sqlserver': 'com.microsoft.sqlserver.jdbc.SQLServerDriver' +} + logger = logging.getLogger(__name__) coloredlogs.install(level='DEBUG', fmt='%(asctime)s,%(msecs)03d | %(levelname)s: %(message)s') \ No newline at end of file diff --git a/yarrrml-translator/yarrrml_translator/function.py b/yarrrml-translator/yarrrml_translator/function.py new file mode 100644 index 0000000..b8b5222 --- /dev/null +++ b/yarrrml-translator/yarrrml_translator/function.py @@ -0,0 +1,108 @@ +from .constants import * +from .termmap import generate_rml_termmap + + +local_id = 0 +def add_functions(yarrrml_data): + global local_id + functions = [] + for mapping in yarrrml_data.get(YARRRML_MAPPINGS): + local_id = 0 + mapping_data = yarrrml_data.get(YARRRML_MAPPINGS).get(mapping) + add_internal_function(mapping, mapping_data, functions) + return functions + +def add_internal_function(mapping_id, mapping_data, functions): + global local_id + keys = mapping_data.keys() + for key in keys: + if type(mapping_data[key]) is list: + for i in range(len(mapping_data[key])): + value = mapping_data[key][i] + if YARRRML_FUNCTION in value and value[YARRRML_FUNCTION] != "equal": + function_id = "function_" + mapping_id + old_id = function_id + "_"+ str(local_id) + function = generate_function(value, function_id) + functions.append(function) + mapping_data[key][i][YARRRML_FUNCTION] = old_id + local_id += 1 #different functions in the same TM + else: + if type(value) is list: + for v in value: + if type(v) is dict: + add_internal_function(mapping_id, v, functions) + elif type(value) is dict: + add_internal_function(mapping_id, value, functions) + elif type(mapping_data[key]) is dict: + if YARRRML_FUNCTION in mapping_data[key] and mapping_data[key][YARRRML_FUNCTION] != "equal": + function_id = "function_" + mapping_id + old_id = function_id + "_" + str(local_id) + function = generate_function(mapping_data[key], function_id) + functions.append(function) + mapping_data[key][YARRRML_FUNCTION] = old_id + local_id += 1 # different functions in the same TM + +def generate_function(function_yarrrml_data, id_function): + global local_id + function = function_yarrrml_data[YARRRML_FUNCTION] + if YARRRML_PARAMETERS in function_yarrrml_data: + rml_function = ["<" + id_function +"_"+str(local_id)+"> a " + RML_EXECUTION_CLASS + ";\n\t"+RML_FUNCTION+" "+function+" ; \n"] + else: + function_yarrrml_data, function_name = split_in_line_function(function) + rml_function = ["<" + id_function + "_" + str( + local_id) + "> a " + RML_EXECUTION_CLASS + ";\n\t" + RML_FUNCTION + " " + function_name + " ; \n"] + + new_function = None + if YARRRML_PARAMETERS in function_yarrrml_data: + rml_function.append("\t"+RML_INPUT+"\n") + parameters = function_yarrrml_data[YARRRML_PARAMETERS] + for param in parameters: + rml_function.append("\t\t[\n\t\t\ta "+RML_INPUT_CLASS + ";\n") + if type(param) is list: + param_extended = {YARRRML_PARAMETER: param[0], YARRRML_VALUE: param[1]} + else: + param_extended = param + + rml_function.append("\t\t\t"+RML_PARAMETER+" "+param_extended[YARRRML_PARAMETER] + ";\n") + + if YARRRML_VALUE in param_extended: + if YARRRML_FUNCTION in param_extended[YARRRML_VALUE]: + local_id += 1 # new function definition within another functon + rml_function.append("\t\t\t" + RML_VALUE_MAP + "[\n\t\t\t\t" + RML_EXECUTION + " <"+id_function+"_"+str(local_id) +">;\n\t\t\t];\n") + new_function = generate_function(param_extended[YARRRML_VALUE],id_function) + else: + rml_function.append(generate_rml_termmap(RML_VALUE_MAP, RML_VALUE_MAP_CLASS, param_extended[YARRRML_VALUE], "\t\t\t\t")) + + rml_function.append("\t\t],\n") + + + final_function = "".join(rml_function)[0:-2]+".\n\n" + if new_function: + final_function += new_function + + return final_function + + + +def split_in_line_function(function_in_line): + parameters = {'parameters':[]} + function_name = function_in_line.split("(")[0] + function_in_line=function_in_line.replace(function_name, "").replace("(","",1).rsplit(")",1)[0] + in_line_params = function_in_line.split(",") + + for param in in_line_params: + extended_param = {} + param_values = param.split("=",1) + extended_param[YARRRML_PARAMETER] = param_values[0].strip() + param_value = param_values[1].strip() + + if param_value.startswith("$("): + extended_param[YARRRML_VALUE] = param_value + else: + value, internal_function_name = split_in_line_function(param_value) + extended_param[YARRRML_VALUE] = {YARRRML_FUNCTION: internal_function_name, YARRRML_PARAMETERS: value[YARRRML_PARAMETERS]} + + parameters[YARRRML_PARAMETERS].append(extended_param) + + + return parameters,function_name \ No newline at end of file diff --git a/yarrrml-translator/yarrrml_translator/mapping.py b/yarrrml-translator/yarrrml_translator/mapping.py index a97fea5..3fea88f 100644 --- a/yarrrml-translator/yarrrml_translator/mapping.py +++ b/yarrrml-translator/yarrrml_translator/mapping.py @@ -44,6 +44,10 @@ def add_prefix(data): template.append(RML_PREFIX + " comp: <" + COMPRESSION_URI + ">.\n") if "void" not in common_prefixes: template.append(RML_PREFIX + " void: <" + VOID_URI + ">.\n") + if "fnml" not in common_prefixes: + template.append(RML_PREFIX + " fnml: <" + FNML_URI + ">.\n") + if "grel" not in common_prefixes: + template.append(RML_PREFIX + " grel: <" + GREL_URI + ">.\n") if "base" not in common_prefixes: template.append(RML_BASE + " <" + EXAMPLE_URI + ">.\n") @@ -78,6 +82,10 @@ def check_common_prefixes(prefix_uri, common_prefixes): common_prefixes.append("comp") elif prefix_uri == VOID_URI: common_prefixes.append("void") + elif prefix_uri == FNML_URI: + common_prefixes.append("fnml") + elif prefix_uri == GREL_URI: + common_prefixes.append("grel") def add_inverse_prefix(rdf_mapping): @@ -100,107 +108,19 @@ def get_non_asserted_mappings(yarrrml_data, mapping_format): mapping_format = STAR_URI elif YARRRML_QUOTED in values: mapping_format = STAR_URI - if type(yarrrml_data.get(YARRRML_MAPPINGS).get(mapping).get(key)) is list and key==YARRRML_SHORTCUT_PREDICATEOBJECT: + if type(yarrrml_data.get(YARRRML_MAPPINGS).get(mapping).get(key)) is list and key==YARRRML_PREDICATEOBJECT_SHORTCUT: for value in yarrrml_data.get(YARRRML_MAPPINGS).get(mapping).get(key): - if type(value) is dict and YARRRML_SHORTCUT_OBJECT in value: - if YARRRML_NON_ASSERTED in value[YARRRML_SHORTCUT_OBJECT]: - mappings[value[YARRRML_SHORTCUT_OBJECT][YARRRML_NON_ASSERTED]] = "non_asserted" + if type(value) is dict and YARRRML_OBJECT_SHORTCUT in value: + if YARRRML_NON_ASSERTED in value[YARRRML_OBJECT_SHORTCUT]: + mappings[value[YARRRML_OBJECT_SHORTCUT][YARRRML_NON_ASSERTED]] = "non_asserted" mapping_format = STAR_URI - elif YARRRML_QUOTED in value[YARRRML_SHORTCUT_OBJECT]: + elif YARRRML_QUOTED in value[YARRRML_OBJECT_SHORTCUT]: mapping_format = STAR_URI return mappings, mapping_format -def add_logical_targets(yarrrml_data): - logical_targets = [] - if YARRRML_TARGETS in yarrrml_data: - targets = yarrrml_data.get(YARRRML_TARGETS) - keys = targets.keys() - for key in keys: - logical_targets.extend(generate_logical_target(targets.get(key), key)) - for mapping in yarrrml_data.get(YARRRML_MAPPINGS): - mapping_data = yarrrml_data.get(YARRRML_MAPPINGS).get(mapping) - add_internal_logical_target(mapping, mapping_data, logical_targets) - - return logical_targets - - -def add_internal_logical_target(mapping_id,mapping_data, internal_targets, local_target_id = 0): - keys = mapping_data.keys() - for key in keys: - if type(mapping_data[key]) is list: - for i in range(len(mapping_data[key])): - value = mapping_data[key][i] - if YARRRML_TARGETS in value: - target_value=value[YARRRML_TARGETS] - if type(target_value) is dict or type(target_value) is list: - logical_target_id = "logical_target_" + mapping_id+"_"+str(local_target_id) - internal_targets.extend(generate_logical_target(target_value, logical_target_id)) - mapping_data[key][i][YARRRML_TARGETS] = logical_target_id - local_target_id += 1 - else: - if type(value) is list: - for v in value: - if type(v) is dict: - add_internal_logical_target(mapping_id, v, internal_targets, local_target_id) - elif type(value) is dict: - add_internal_logical_target(mapping_id, value, internal_targets, local_target_id) - elif YARRRML_TARGETS in mapping_data[key]: - target_value = mapping_data[key][YARRRML_TARGETS] - logical_target_id = "logical_target_" + mapping_id + "_" + str(local_target_id) - internal_targets.extend(generate_logical_target(target_value, logical_target_id)) - mapping_data[key][YARRRML_TARGETS] = logical_target_id - local_target_id += 1 - -def generate_logical_target(target_yaml_data, id_target): - logical_targets = [] - output_type = None - format = None - compression = None - target_yaml_data_list = target_yaml_data - if (type(target_yaml_data) is list and type(target_yaml_data[0]) is str) or type(target_yaml_data) is dict: - target_yaml_data_list = [target_yaml_data] - - for target_yaml_data in target_yaml_data_list: - logical_target = ["<" + id_target + "> a " + RML_LOGICAL_TARGET_CLASS + ";\n"] - if type(target_yaml_data) is list: - value = target_yaml_data[0].split("~") - access = value[0] - if len(value) == 2: - output_type = value[1] - if len(target_yaml_data) >= 2: - format = "formats:" + YARRRML_OUTPUT_FORMAT[target_yaml_data[1]] - if len(target_yaml_data) == 3: - compression = "comp:" + target_yaml_data[2] - else: - access = target_yaml_data[YARRRML_ACCESS] - if YARRRML_TYPE in target_yaml_data: - output_type = target_yaml_data[YARRRML_TYPE] - if YARRRML_SERIALIZATION in target_yaml_data: - format = "formats:" + YARRRML_OUTPUT_FORMAT[target_yaml_data[YARRRML_SERIALIZATION]] - if YARRRML_COMPRESSION in target_yaml_data: - compression = "comp:" + target_yaml_data[YARRRML_COMPRESSION] - - logical_target.append("\t " + RML_TARGET + " [\n\t\t") - - if output_type == "sparql": - logical_target.append("sd:endpoint <" + access + ">;\n\t\tsd:supportedLanguage sd:SPARQL11Update\n\t];\n") - elif output_type == "dcat": - logical_target.append("a dcat:Dataset;\n\t\tdcat:dataDump <" + access + ">\n\t];\n") - else: - logical_target.append("a void:Dataset;\n\t\tvoid:dataDump <" + access + ">\n\t];\n") - - if format: - logical_target.append("\t " + RML_SERIALIZATION + " " + format + ";") - else: - logical_target.append("\t " + RML_SERIALIZATION + " formats:N-Quads;") - - if compression: - logical_target.append("\n\t " + RML_COMPRESSION + " " + compression + ";") - logical_targets.append("".join(logical_target)[0:-1] + ".\n\n") - return logical_targets def merge_mapping_section_by_key(key,yarrrml_list): output = {key:{}} for yarrrml_mapping in yarrrml_list: diff --git a/yarrrml-translator/yarrrml_translator/predicateobject.py b/yarrrml-translator/yarrrml_translator/predicateobject.py index a73b586..741bb41 100644 --- a/yarrrml-translator/yarrrml_translator/predicateobject.py +++ b/yarrrml-translator/yarrrml_translator/predicateobject.py @@ -1,7 +1,7 @@ import rdflib -from . import * -from .source import get_initial_sources, add_source +from .constants import * +from .source import get_initial_sources, add_source, add_table from .subject import add_subject from .termmap import generate_rml_termmap, check_type @@ -9,28 +9,34 @@ def get_object_access(predicate_object_map): if YARRRML_OBJECT in predicate_object_map: object_access = YARRRML_OBJECT - elif YARRRML_SHORTCUT_OBJECT in predicate_object_map: - object_access = YARRRML_SHORTCUT_OBJECT + elif YARRRML_OBJECT_SHORTCUT in predicate_object_map: + object_access = YARRRML_OBJECT_SHORTCUT + elif YARRRML_OBJECTS in predicate_object_map: + object_access = YARRRML_OBJECTS else: - raise Exception("There isn't an object key correctly specify in " + predicate_object_map) + logger.error("There isn't a valid object key (object, objects, o) correctly specify in PON " + predicate_object_map) + raise Exception("Add or change the key of the object in the indicated POM") return object_access def get_predicate_access(predicate_object_map): if YARRRML_PREDICATES in predicate_object_map: predicate_access = YARRRML_PREDICATES - elif YARRRML_SHORTCUT_PREDICATES in predicate_object_map: - predicate_access = YARRRML_SHORTCUT_PREDICATES + elif YARRRML_PREDICATES_SHORTCUT in predicate_object_map: + predicate_access = YARRRML_PREDICATES_SHORTCUT + elif YARRRML_PREDICATE in predicate_object_map: + predicate_access = YARRRML_PREDICATE else: - raise Exception("There isn't a predicate key correctly specify in " + predicate_object_map) + logger.error("There isn't a valid predicate key (predicate, predicates, p) correctly specify in PON " + predicate_object_map) + raise Exception("Add or change the key of the predicate in the indicated POM") return predicate_access -def get_predicate_object_access(mapping,predicate_object_map): +def get_predicate_object_access(mapping, predicate_object_map): if YARRRML_PREDICATEOBJECT in predicate_object_map: predicate_object_access = YARRRML_PREDICATEOBJECT - elif YARRRML_SHORTCUT_PREDICATEOBJECT in predicate_object_map: - predicate_object_access = YARRRML_SHORTCUT_PREDICATEOBJECT + elif YARRRML_PREDICATEOBJECT_SHORTCUT in predicate_object_map: + predicate_object_access = YARRRML_PREDICATEOBJECT_SHORTCUT else: predicate_object_access = None logger.warning("The triples map "+mapping+" does not have predicate object maps defined") @@ -42,8 +48,8 @@ def get_graph_access(predicate_object_map): graph_access = YARRRML_GRAPHS elif YARRRML_GRAPH in predicate_object_map: graph_access = YARRRML_GRAPH - elif YARRRML_SHORTCUT_GRAPH in predicate_object_map: - graph_access = YARRRML_SHORTCUT_GRAPH + elif YARRRML_GRAPH_SHORTCUT in predicate_object_map: + graph_access = YARRRML_GRAPH_SHORTCUT else: graph_access = None return graph_access @@ -86,8 +92,11 @@ def get_object_list(predicate_object, object_access): elif YARRRML_TYPE in object: object_list.append([object[YARRRML_VALUE]+"~"+object[YARRRML_TYPE]]) elif YARRRML_VALUE in object: - if YARRRML_TARGETS in object: - object_list.append([object[YARRRML_VALUE], object[YARRRML_TARGETS]]) + if YARRRML_TARGETS in object or YARRRML_FUNCTION in object: + if YARRRML_TARGETS in object: + object_list.append([object[YARRRML_VALUE], object[YARRRML_TARGETS]]) + if YARRRML_FUNCTION in object: + object_list.append([object[YARRRML_VALUE], object[YARRRML_FUNCTION]]) else: object_list.append([object[YARRRML_VALUE]]) else: @@ -184,7 +193,6 @@ def add_predicate_object(data, mapping, predicate_object, mapping_format=RML_URI template += generate_rml_termmap(STAR_OBJECT, STAR_CLASS,om, "\t\t\t", mapping_format) else: template += ref_mapping(data, mapping, om, YARRRML_QUOTED, STAR_QUOTED, mapping_format) - # This could be removed else: if YARRRML_VALUE in om: object_value = om.get(YARRRML_VALUE) @@ -196,6 +204,10 @@ def add_predicate_object(data, mapping, predicate_object, mapping_format=RML_URI if mapping_format == STAR_URI: template += generate_rml_termmap(STAR_OBJECT, R2RML_OBJECT_CLASS, object_value, "\t\t\t", mapping_format) + elif YARRRML_FUNCTION in om: + template += generate_rml_termmap(STAR_OBJECT, R2RML_OBJECT_CLASS, om[YARRRML_FUNCTION], "\t\t\t", mapping_format) + template = template.replace(R2RML_CONSTANT+" "+om[YARRRML_FUNCTION], RML_EXECUTION + " <" + om.get( + YARRRML_FUNCTION) + ">") else: template += generate_rml_termmap(R2RML_OBJECT, R2RML_OBJECT_CLASS, object_value, "\t\t\t", mapping_format) @@ -218,6 +230,8 @@ def add_predicate_object(data, mapping, predicate_object, mapping_format=RML_URI if YARRRML_TARGETS in om: template = template[0:len(template) - 5] + "\t\t\t" + RML_LOGICAL_TARGET + " <"+ om.get(YARRRML_TARGETS) + ">\n\t\t];\n" + + for graph in graph_list: graph_value = graph if YARRRML_VALUE in graph: @@ -268,13 +282,15 @@ def ref_mapping(data, mapping, om, yarrrml_key, ref_type_property, mapping_forma ";\n\t\t\t\t" + R2RML_PARENT + " " + parent + ";\n\t\t\t]; \n" else: - raise Exception("Error: more than two parameters in join condition in mapping " + mapping) + logger.error("Error in reference mapping another mapping in mapping " + mapping) + raise Exception("Only two parameters can be indicated (child and parent)") template += "\t\t];\n" else: template += "\n\t\t]\n" else: - raise Exception("Error in reference mapping another mapping in mapping " + mapping) + logger.error("Error in reference mapping another mapping in mapping " + mapping) + raise Exception("Review how is defined the reference to other mappings") return template diff --git a/yarrrml-translator/yarrrml_translator/source.py b/yarrrml-translator/yarrrml_translator/source.py index a39095b..783dc53 100644 --- a/yarrrml-translator/yarrrml_translator/source.py +++ b/yarrrml-translator/yarrrml_translator/source.py @@ -86,19 +86,19 @@ def add_source_simplified(mapping, source): file_path = re.sub("~.*", "", source[0]) reference_formulation = source[0].split('~')[1] source_extension = file_path.split('.')[1] - ref_formulation_rml = reference_formulation.replace("jsonpath", "JSONPath").replace("csv", "CSV").replace("xpath", - "XPath") + ref_formulation_rml = YARRRML_REFERENCE_FORMULATIONS[reference_formulation] + if switch_in_reference_formulation(reference_formulation) != source_extension: raise Exception( "ERROR: mismatch extension and referenceFormulation in source " + source + " in mapping " + mapping) else: - if len(source) == 1: # si no tiene iterador + if len(source) == 1: # do not have iterator if source_extension == "csv" or source_extension == "SQL2008": source_rdf += '"' + file_path + '"' + ";\n" + "\t\t" + RML_REFERENCE_FORMULATION + " ql:" \ + ref_formulation_rml + "\n" + "\t];\n" else: raise Exception("ERROR: source " + source + " in mapping " + mapping + " has no iterator") - else: # source[1] es el iterador en json y xml + else: # source[1] is the iterator for json and xml source_rdf += "\"" + file_path + "\";\n\t\t" + RML_REFERENCE_FORMULATION + " ql:" \ + ref_formulation_rml + ";\n\t\t" + RML_ITERATOR + " \"" \ + source[1] + "\";\n\t];\n" @@ -114,8 +114,8 @@ def add_source_full(mapping, source): if YARRRML_REFERENCE_FORMULATION in source: reference_formulation = str(source.get(YARRRML_REFERENCE_FORMULATION)) format_from_reference = switch_in_reference_formulation(reference_formulation.lower()) - ref_formulation_rml = reference_formulation.replace("jsonpath", "JSONPath").replace("csv", "CSV").replace( - "xpath","XPath") + ref_formulation_rml = YARRRML_REFERENCE_FORMULATIONS[reference_formulation] + if extension != format_from_reference or format_from_reference == "ERROR": raise Exception("ERROR: not referenceFormulation found or mismatch between the format and " "referenceFormulation in source " + access + "in mapping " + mapping) @@ -202,12 +202,8 @@ def generate_database_connections(data, list_initial_sources): if (external and len(sources_ids) > number_external_sources) or not external: if YARRRML_QUERY in source and YARRRML_ACCESS in source: db_type = source.get(YARRRML_TYPE) - if db_type == "mysql": - driver = "com.mysql.jdbc.Driver" - elif db_type == "postgresql": - driver = "org.postgresql.Driver" - elif db_type == "sqlserver": - driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver" + if db_type in YARRRML_DATABASES_DRIVER: + driver = YARRRML_DATABASES_DRIVER[db_type] else: driver = None access = source.get(YARRRML_ACCESS) diff --git a/yarrrml-translator/yarrrml_translator/subject.py b/yarrrml-translator/yarrrml_translator/subject.py index ebbfaf1..6cee6ea 100644 --- a/yarrrml-translator/yarrrml_translator/subject.py +++ b/yarrrml-translator/yarrrml_translator/subject.py @@ -8,8 +8,8 @@ def add_subject(data, mapping, mapping_format): rml_subjects = [] only_one = False - if YARRRML_SHORTCUT_SUBJECTS in data.get(YARRRML_MAPPINGS).get(mapping): - subject = data.get(YARRRML_MAPPINGS).get(mapping).get(YARRRML_SHORTCUT_SUBJECTS) + if YARRRML_SUBJECTS_SHORTCUT in data.get(YARRRML_MAPPINGS).get(mapping): + subject = data.get(YARRRML_MAPPINGS).get(mapping).get(YARRRML_SUBJECTS_SHORTCUT) elif YARRRML_SUBJECTS in data.get(YARRRML_MAPPINGS).get(mapping): subject = data.get(YARRRML_MAPPINGS).get(mapping).get(YARRRML_SUBJECTS) elif YARRRML_SUBJECT in data.get(YARRRML_MAPPINGS).get(mapping): @@ -41,8 +41,15 @@ def add_subject(data, mapping, mapping_format): subject_value = individual_subject if YARRRML_VALUE in individual_subject: subject_value = individual_subject.get(YARRRML_VALUE) + elif YARRRML_FUNCTION in individual_subject: + subject_value = individual_subject.get(YARRRML_FUNCTION) + subject_termmap = generate_rml_termmap(R2RML_SUBJECT, R2RML_SUBJECT_CLASS, subject_value, "\t\t", mapping_format) + if YARRRML_FUNCTION in individual_subject: + subject_termmap = subject_termmap.replace(R2RML_CONSTANT+" "+subject_value, RML_EXECUTION + " <" + individual_subject.get( + YARRRML_FUNCTION) + ">") + if YARRRML_TARGETS in individual_subject: subject_termmap = subject_termmap[0:-3]+"\t"+RML_LOGICAL_TARGET+" <"+individual_subject[YARRRML_TARGETS]+">\n\t];\n" @@ -52,8 +59,8 @@ def add_subject(data, mapping, mapping_format): graphs = data.get(YARRRML_MAPPINGS).get(mapping).get(YARRRML_GRAPHS) elif YARRRML_GRAPH in data.get(YARRRML_MAPPINGS).get(mapping): graphs = data.get(YARRRML_MAPPINGS).get(mapping).get(YARRRML_GRAPH) - elif YARRRML_SHORTCUT_GRAPH in data.get(YARRRML_MAPPINGS).get(mapping): - graphs = data.get(YARRRML_MAPPINGS).get(mapping).get(YARRRML_SHORTCUT_GRAPH) + elif YARRRML_GRAPH_SHORTCUT in data.get(YARRRML_MAPPINGS).get(mapping): + graphs = data.get(YARRRML_MAPPINGS).get(mapping).get(YARRRML_GRAPH_SHORTCUT) else: graphs = [] diff --git a/yarrrml-translator/yarrrml_translator/target.py b/yarrrml-translator/yarrrml_translator/target.py new file mode 100644 index 0000000..70dd6ee --- /dev/null +++ b/yarrrml-translator/yarrrml_translator/target.py @@ -0,0 +1,91 @@ +from .constants import * + +def add_logical_targets(yarrrml_data): + logical_targets = [] + if YARRRML_TARGETS in yarrrml_data: + targets = yarrrml_data.get(YARRRML_TARGETS) + keys = targets.keys() + for key in keys: + logical_targets.extend(generate_logical_target(targets.get(key), key)) + + for mapping in yarrrml_data.get(YARRRML_MAPPINGS): + mapping_data = yarrrml_data.get(YARRRML_MAPPINGS).get(mapping) + add_internal_logical_target(mapping, mapping_data, logical_targets) + + return logical_targets + + +def add_internal_logical_target(mapping_id,mapping_data, internal_targets, local_target_id = 0): + keys = mapping_data.keys() + for key in keys: + if type(mapping_data[key]) is list: + for i in range(len(mapping_data[key])): + value = mapping_data[key][i] + if YARRRML_TARGETS in value: + target_value=value[YARRRML_TARGETS] + if type(target_value) is dict or type(target_value) is list: + logical_target_id = "logical_target_" + mapping_id+"_"+str(local_target_id) + internal_targets.extend(generate_logical_target(target_value, logical_target_id)) + mapping_data[key][i][YARRRML_TARGETS] = logical_target_id + local_target_id += 1 + else: + if type(value) is list: + for v in value: + if type(v) is dict: + add_internal_logical_target(mapping_id, v, internal_targets, local_target_id) + elif type(value) is dict: + add_internal_logical_target(mapping_id, value, internal_targets, local_target_id) + elif YARRRML_TARGETS in mapping_data[key]: + target_value = mapping_data[key][YARRRML_TARGETS] + logical_target_id = "logical_target_" + mapping_id + "_" + str(local_target_id) + internal_targets.extend(generate_logical_target(target_value, logical_target_id)) + mapping_data[key][YARRRML_TARGETS] = logical_target_id + local_target_id += 1 + +def generate_logical_target(target_yaml_data, id_target): + logical_targets = [] + output_type = None + format = None + compression = None + target_yaml_data_list = target_yaml_data + if (type(target_yaml_data) is list and type(target_yaml_data[0]) is str) or type(target_yaml_data) is dict: + target_yaml_data_list = [target_yaml_data] + + for target_yaml_data in target_yaml_data_list: + logical_target = ["<" + id_target + "> a " + RML_LOGICAL_TARGET_CLASS + ";\n"] + if type(target_yaml_data) is list: + value = target_yaml_data[0].split("~") + access = value[0] + if len(value) == 2: + output_type = value[1] + if len(target_yaml_data) >= 2: + format = "formats:" + YARRRML_OUTPUT_FORMAT[target_yaml_data[1]] + if len(target_yaml_data) == 3: + compression = "comp:" + target_yaml_data[2] + else: + access = target_yaml_data[YARRRML_ACCESS] + if YARRRML_TYPE in target_yaml_data: + output_type = target_yaml_data[YARRRML_TYPE] + if YARRRML_SERIALIZATION in target_yaml_data: + format = "formats:" + YARRRML_OUTPUT_FORMAT[target_yaml_data[YARRRML_SERIALIZATION]] + if YARRRML_COMPRESSION in target_yaml_data: + compression = "comp:" + target_yaml_data[YARRRML_COMPRESSION] + + logical_target.append("\t " + RML_TARGET + " [\n\t\t") + + if output_type == "sparql": + logical_target.append("sd:endpoint <" + access + ">;\n\t\tsd:supportedLanguage sd:SPARQL11Update\n\t];\n") + elif output_type == "dcat": + logical_target.append("a dcat:Dataset;\n\t\tdcat:dataDump <" + access + ">\n\t];\n") + else: + logical_target.append("a void:Dataset;\n\t\tvoid:dataDump <" + access + ">\n\t];\n") + + if format: + logical_target.append("\t " + RML_SERIALIZATION + " " + format + ";") + else: + logical_target.append("\t " + RML_SERIALIZATION + " formats:N-Quads;") + + if compression: + logical_target.append("\n\t " + RML_COMPRESSION + " " + compression + ";") + logical_targets.append("".join(logical_target)[0:-1] + ".\n\n") + return logical_targets \ No newline at end of file diff --git a/yarrrml-translator/yarrrml_translator/termmap.py b/yarrrml-translator/yarrrml_translator/termmap.py index ebfa881..754841f 100644 --- a/yarrrml-translator/yarrrml_translator/termmap.py +++ b/yarrrml-translator/yarrrml_translator/termmap.py @@ -1,4 +1,4 @@ -from .import * +from .constants import * ## return the type of TermMap based on the input text