diff --git a/.gitattributes b/.gitattributes
index eea259e2..50d31d15 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,4 @@
docs/apidocs/* binary
+
+# Mark Jelly files as binary
+*.jelly binary
diff --git a/.gitignore b/.gitignore
index d2e91178..43e76666 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,13 @@
.idea
-target
-rmlmapper.iml
+target/*
+*.iml
.DS_Store
.settings
.vscode
-.attach_*
\ No newline at end of file
+.attach_*
+ojdbc*.jar
+pom-oracle.xml
+dependency-reduced-pom.xml
+settings.xml
+.classpath
+.project
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3454e6e1..856fa4c9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,28 +1,139 @@
-image: maven:3.5.0-jdk-8
+stages:
+ - lint
+ - unittests
+ - mirror
+ - release
+ - deploy
+
+include:
+ # Make sure the CHANGELOG is always updated
+ - project: 'rml/util/ci-templates'
+ ref: main
+ file: 'CHANGELOG.gitlab-ci.yml'
+# # Push a Docker Image to Docker Hub on new tags
+# - project: 'rml/util/ci-templates'
+# ref: main
+# file: 'Docker-Hub.gitlab-ci.yml'
+ # Push a build to Maven Central on new tags
+ - project: 'rml/util/ci-templates'
+ ref: main
+ file: 'Maven-Central.gitlab-ci.yml'
variables:
# This will suppress any download for dependencies and plugins or upload messages which would clutter the console log.
# `showDateTime` will show the passed time in milliseconds.
MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
- MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
+ MAVEN_CLI_OPTS: "-s $CI_PROJECT_DIR/.m2/settings.xml --batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
# Postgres
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: "YourSTRONG!Passw0rd"
# SQLServer
- ACCEPT_EULA: Y
+ ACCEPT_EULA: "Y"
SA_PASSWORD: "YourSTRONG!Passw0rd"
+ # https://hub.docker.com/r/alpine/git/tags
+ GIT_VERSION: v2.32.0
cache:
key: ${CI_JOB_NAME}
paths:
- .m2/repository
-verify:
+# Cancel pipeline if a newer pipeline is running
+default:
+ interruptible: true
+
+###############################
+# #
+# Unittests #
+# #
+###############################
+
+General:
+ stage: unittests
+ image:
+ name: maven:3-eclipse-temurin-21
+ pull_policy: if-not-present
+ services:
+ - name: docker:29-dind
+ # explicitly disable tls to avoid docker startup interruption
+ command: ["--tls=false"]
+ variables:
+ # Instruct Testcontainers to use the daemon of DinD.
+ DOCKER_HOST: "tcp://docker:2375"
+ # Instruct Docker not to start over TLS.
+ DOCKER_TLS_CERTDIR: ""
+ # Improve performance with overlayfs.
+ DOCKER_DRIVER: overlay2
+ script:
+ - 'mvn $MAVEN_CLI_OPTS -Dtest=$TEST test 2>&1 | tee $TEST.log'
+ artifacts:
+ when: always
+ paths:
+ - '$TEST.log'
+ parallel:
+ matrix:
+ - TEST: [ArgumentsTest, MapperCSVTest, MapperJSONTest, MapperMySQLTest, MapperPostgresR2RMLTest, MapperWoTTest, ArgumentsTestMySQLTest, MapperCSVWTest, MapperLDESTest, MapperODSTest, MapperOracleDBTest, MapperPostgresXMLTest, MapperXMLTest, CustomRMLFnOMapperCSVTest, MapperEXCELTest, MapperMappingFileURLTest, MapperSPARQLTest, MetadataTest, CustomRMLFnOMapperJSONTest, CustomRMLFnOMapperTest, MapperHTMLTest, MapperMySQLR2RMLTest, MapperPostgresCSVTest, MapperSQLServerTest, OptimizationsTest, R2RMLConverterTest, QuadTest, ReadmeTest, ReadmeFunctionTest, ConformerDetectionTest, MapperNewRMLCoreJSONTest, MapperNewRMLIOSourceTest, MapperNewRMLIOTargetTest, HttpRequestTargetTest, MapperCrossConcatSequenceTest]
+ except:
+ - master
+ - development
+
+# Generate R2RML test report and attach it as a artifact.
+# Manual: make a MR to the rml.io website
+R2RML Test Report:
+ stage: deploy
+ image:
+ name: docker:29
+ pull_policy: if-not-present
+ services:
+ - docker:29-dind
+ before_script:
+ # Dependencies
+ - apk add git python3 python3-dev py3-pip postgresql-dev postgresql libpq gcc musl-dev docker docker-compose java-jre-headless maven java-jdk
+
+ # Clone the repository via HTTPS inside a new directory
+ - git clone "https://github.com/kg-construct/r2rml-test-cases-support"
+
+ # Set the displayed user with the commits that are about to be made
+ - git config --global user.email "${GIT_USER_EMAIL:-$GITLAB_USER_EMAIL}"
+ - git config --global user.name "${GIT_USER_NAME:-$GITLAB_USER_NAME}"
+
+ # Show docker
+ - docker info
script:
- - 'mvn $MAVEN_CLI_OPTS test'
+ # Variables
+ - R2RML_TAG_NAME=$(git tag -l "v*" --sort=-creatordate | head -n1 || echo "$CI_COMMIT_REF_NAME")
+ - (if [ "$R2RML_TAG_NAME" == "$CI_COMMIT_REF_NAME" ]; then echo "$CI_COMMIT_REF_NAME"; else R2RML_TAG_NAME=$(echo "$R2RML_TAG_NAME" | cut -c2-); fi)
+ - R2RML_TAG_NAME=$(echo "$R2RML_TAG_NAME" | tr -d '\n')
+ - TODAY=$(date +"%Y-%m-%d")
+
+ # Build RMLMapper jar
+ - mvn install -DskipTests=true
+
+ # Setup R2RML test cases configs
+ - cp data/r2rml-test-cases-config-postgresql.ini r2rml-test-cases-support/config-postgresql.ini
+ - cp data/r2rml-test-cases-config-mysql.ini r2rml-test-cases-support/config-mysql.ini
+ - cd r2rml-test-cases-support
+ - echo "Generating test report for release v${R2RML_TAG_NAME} on ${TODAY}"
+ - sed -i "s/VERSION/${R2RML_TAG_NAME}/" config-postgresql.ini
+ - sed -i "s/VERSION/${R2RML_TAG_NAME}/" config-mysql.ini
+ - sed -i "s/DATE/${TODAY}/" config-postgresql.ini
+ - sed -i "s/DATE/${TODAY}/" config-mysql.ini
+
+ # Install R2RML test cases dependencies
+ - python3 -m pip install requests 'rdflib==6.0.2' 'psycopg2-binary<3' 'mysql-connector-python<9' --break-system-packages
+
+ # Execute R2RML test cases
+ - HOST=docker python3 test.py config-postgresql.ini
+ - HOST=$(getent hosts docker | cut -f1 -d " ") python3 test.py config-mysql.ini # MySQL wants an IP address
-services:
- - postgres:10.4
- - name: microsoft/mssql-server-linux:latest
- alias: sqlserver
+ - cd ..
+ # Run during merge requests and tags
+ except:
+ - development
+ - master
+ artifacts:
+ when: always
+ paths:
+ - $CI_PROJECT_DIR/r2rml-test-cases-support/results.ttl
+ - $CI_PROJECT_DIR/r2rml-test-cases-support/config-*.ini
diff --git a/.m2/settings.xml b/.m2/settings.xml
new file mode 100644
index 00000000..48953beb
--- /dev/null
+++ b/.m2/settings.xml
@@ -0,0 +1,10 @@
+
+
+
+ central
+ ${env.MAVEN_REPO_USER}
+ ${env.MAVEN_REPO_PASS}
+
+
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6e64f935..148a5c8e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,11 +2,631 @@
All notable changes to this project will be documented in this file.
-The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.1.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## Unreleased
+## [8.1.0] - 2025-12-23
+
+### Added
+- `crossConcat` and `crossConcatSequence` functions (by updating dependency to idlab-functions-java)
+
+### Changed
+- Requires Java version >= 21
+
+### Fixed
+- Updated dependency function-agent-java to 1.3.0
+- Updated idlab-functions-java to 1.4.0
+- Publish to Maven Central using central-publishing-maven-plugin
+
+## [8.0.1] - 2025-12-11
+
+### Fixed
+- Dependency updates to address some vulnerabilities:
+- DataIO to 2.5.2
+- Jena to 5.2.0
+- commons-lang3 to 3.18.0
+- json-smart to 2.5.2
+- Added dependency to commons-cli (a transitive dependency which got lost)
+- Update DataIO to 2.2.0 (to address https://github.com/RMLio/rmlmapper-java/issues/266)
+- Update testcontainers-* dependencies to 2.0.2
+- GitLab CI: update GitLab CI Docker (services) to version 29
+- Update grel-functions-java to v0.10.1 to fix bug in quotient function
+
+## [8.0.0] - 2025-09-18
+
+### Fixed
+- A join between triples maps with different logical targets might result in quads ending up in wrong targets.
+- rmle:contentTypeHeader and rmle:acceptHeader is replaced by generic htv:headers for Http Request Targets.
+- Comparing htv:headers might go wrong due to String comparison.
+- Conversion to new RML goes wrong when an object map has term type Literal.
+
+### Added
+- Option to serialize output as Jelly.
+
+### Changed
+- Updated new RML test cases for IO and Core.
+- Updated dependency of DataIO to 2.1.2
+
+### Removed
+- `QuadStore`: removed deprecated `write` methods.
+
+## [7.3.3] - 2025-04-07
+
+### Fixed
+- Better handle unsupported reference formulation (See [issue 247](https://github.com/RMLio/rmlmapper-java/issues/247))
+- Graph Maps with default graph must not be ignored (See [issue 252](https://github.com/RMLio/rmlmapper-java/issues/252))
+- Honor datatypes for constants (See [issue 251](https://github.com/RMLio/rmlmapper-java/issues/251))
+- Honor language tags for constants (See [issue 251](https://github.com/RMLio/rmlmapper-java/issues/251))
+
+## [7.3.2] - 2025-03-04
+
+### Fixed
+- Updated Function Agent to 1.2.1 because of a bugfix (See [this issue in Gitlab](https://gitlab.ilabt.imec.be/KNoWS/fno/proc/function-component/-/issues/23), fixes [#249](https://github.com/RMLio/rmlmapper-java/issues/249) on GitHub;
+
+## [7.3.1] - 2025-01-22
+
+### Fixed
+- Upgraded dataio to 2.0.1 incorporating dataio security fixes.
+- Upgraded logback-core to 1.5.16 to fix 2 security CVEs.
+
+## [7.3.0] - 2025-01-22
+
+### Changed
+- Some tests are changed because record error handling has changed.
+
+### Fixed
+- Optimization for authentication with CSS Client Credentials
+- Update URI of prefix 'rmle:' to persistent w3id URI: 'https://w3id.org/imec/rml/ns/extensions#'
+- Added all known content types for newline delimited JSON
+- Fixed the return type of GREL array slice function in function description.
+- Updated all Jena library dependencies to version 5.0.0
+- Added explicit dependencies on commons-io:2.18.0, commons-compress-1.27.1 and commons-lang3:3.17.0 to avoid runtime errors.
+- Updated rdf4j-client to 5.1.0
+- Updated wiremock to 3.9.1 (3.10.0 contains bugs in combination with saxon).
+- Updated grel-functions-java to v0.10.0
+- Updated dataio to 2.0.0, *the* reason for most changes ;)
+- Updated testcontainers to 1.18.3
+- Inconsistencies in test case RMLTC0007h (mapping + all formats) and RMLTC0009a (JSON)
+
+## [7.2.0] - 2024-12-09
+
+### Added
+- CLI option `--convert-mapping` to convert your existing R2RML and older RML mappings
+to the latest version by the W3C Community Group.
+- HTTP request targets
+- dynamic logical targets
+
+### Fixed
+- GREL array functions handling.
+
+## [7.1.2] - 2024-09-19
+
+### Fixed
+- `release.sh` now also updates `pom.xml` with the given tag.
+
+## [7.1.1] - 2024-09-19
+
+### Fixed
+- Updated idlab-functions-java to 1.3.3 to use correct state path in stateful functions when `ifState` environment variable is set.
+
+### Changed
+- CI: use local script for release
+
+## [7.1.0] - 2024-08-13
+
+### Added
+- Serialization format TriG is now supported for Logical Targets (fixes GitHub [issue 225](https://github.com/RMLio/rmlmapper-java/issues/225)).
+
+### Fixed
+- Crash when null is returned in an XPath function for subject generation (fixes GitHub [issue 236](https://github.com/RMLio/rmlmapper-java/issues/236))
+- Update to DataIO 1.3.1: `DATAIO_NULL` value occurring in RDF output when CSV quoted string has newline character in it (fixes GitHub [issue 238](https://github.com/RMLio/rmlmapper-java/issues/238))
+- RML Test report script: remove newlines from R2RML targ name
+
+## [7.0.0] - 2024-06-07
+
+### Fixed
+- Gitlab CI R2RML test cases compliance
+- Gitlab CI Maven Central retrying on failure due to Maven Central server problems
+- Gitlab CI Docker Hub deployment fixed
+- Update DataIO dependency to 1.1.0 (fixes GitLab [issue 274](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/274))
+- R2RML Test Report CI script failed in development due to missing pip parameter.
+- Optimization for self-joins without join conditions (fixes Gitlab [issue 275](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/275))
+- Optimization for self joins with join condition.
+- Updated junit to 5.10.0
+- Updated jena to 4.9.0
+- Updated testcontainers to 1.18.3
+- Added explicit dependency on json-smart, since it was an indirect dependency which changed scope
+- Updated idlab-functions-java to 1.3.2, fixing an issue with IncRML
+- Updated dataio to 1.2.0
+- Changed scope of `json-path` dependency to `runtime`
+
+### Changed
+- Changed basepath from null to http://example.com/ (see [issue 263](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/263))
+- gitlab CI pull policy
+
+### Added
+- Translation to new RML. Only for Core.
+
+## [6.5.1] - 2023-12-06
+
+## Fixed
+- Upgrade logback-classic to 1.4.14.
+- Upgrade wiremock-jre8 to 2.35.1.
+
+## [6.5.0] - 2023-12-06
+
+### Changed
+- Update dependency on `idlab-functions-java` to 1.3.1. This implies three things:
+ - The namespace for IDLab functions FnO descriptions changed, so RMLMapper loads the old and the new one to remain compatible;
+ - All tests in RMLMapper use the new namespace;
+ - Stateful functions use a more compact and efficient state.
+- Update dependency on `function-agent-java` to 1.2.0, the first version released on Maven Central.
+- Upgraded rdf4j-client dependency to version 4.3.8
+- Compile regex patterns for RDF4J store only once for performance.
+
+### Fixed
+- Setting option `disable-automatic-eof-marker` in a configuration file has no effect (see GitLab [issue #269](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/269)).
+- Start adhering to [Keep a Changelog](http://keepachangelog.com/en/1.1.0/) from now on (`Improvements` -> `Changed`).
+- Compatibility issue with old IDLab functions FnO descriptions (see GitLab [issue #270](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/270))
+
+### Added
+- Test case for working with CSV logical sources without header.
+
+## [6.4.0] - 2023-11-14
+
+### Added
+- Test handling Windows CRLF line ending for CSV files ([issue #201](https://github.com/RMLio/rmlmapper-java/issues/201))
+- Added test for empty column handling in csv logical source files ([issue #159](https://github.com/RMLio/rmlmapper-java/issues/159))
+
+### Improvements
+- Tests: let Java handle temporary files.
+- pom: upgrade maven-surefire-plugin to 3.2.2
+- pom: upgrade nexus-staging-maven-plugin to 1.6.13
+- pom: upgrade json-path to 2.8.0
+- pom: upgrade logback-classic to 1.4.11
+- resources: rml-ldes: avoid symlinks
+- pom: upgrade RDB connectors (postgresql 42.6.0, mssql-jdbc 12.4.2.jre11, ojdbc11 23.3.0.23.09, mysql-connector-j 8.2.0)
+
+### Changed
+- Use the DataIO library to handle access to files.
+- Requires Java 17 language level.
+- Refactoring to use interfaces where possible (e.g. `ArrayList` -> `List`).
+
+### Fixed
+- Test cases: add array initializers to avoid bugs.
+- Use correct prefix for `EventStreamTarget`s in tests.
+- Refactoring of Executor: code deduplication
+- Document `--disable-automatic-eof-marker` option.
+
+## [6.3.0] - 2023-11-14
+
+### Improvements
+- Add support for detecting additions, modifications, and deletions in a Knowledge Graph with FnO functions.
+- Verify LDES EventStreamTarget output for additions, modifications, and deletions.
+- Added RML-LDES test-cases.
+- Added test for mapping with CSV file where column does not match header
+
+### Changed
+- Build Docker image in two stages, reducing the final image size.
+- LDES EventStreamTarget properties are now all optional.
+- Removed usage of legacy RDF model, using RDF4J instead.
+
+### Fixed
+- Don't close output streams that don't need closing.
+- Add url decoders to file paths so special characters and spaces work.
+- Test cases: add array initializers to avoid bugs.
+
+## [6.2.2] - 2023-10-05
+
+### Fixed
+- Fixed self-joins with join conditions ([internal issue #199](https://github.com/RMLio/rmlmapper-java/issues/199))
+- Upgrade to rdfhdt to 3.0.10 ([issue #215](https://github.com/RMLio/rmlmapper-java/issues/215))
+- Improve docs on deduplication ([issue #214](https://github.com/RMLio/rmlmapper-java/issues/214))
+- Handle plain old Java Arrays as well for FnO return values
+- Update dependency to `idlab-functions-java`, fixing [issue #218](https://github.com/RMLio/rmlmapper-java/issues/218)
+
+### Changed
+- Dockerfile: switched to Eclipse OpenJDK Docker base image because OpenJDK is deprecated
+- CI: dropped GitHub release automation
+- CI: verify if token is valid
+
+### Improvements
+- Heavily increased performance of RMLMapper through several optimizations
+
+## [6.2.1] - 2023-07-06
+
+### Fixed
+- Updated idlab-functions-java to v1.0.0
+- CSVW 1025 testcase now reads correct logical source
+
+## [6.2.0] - 2023-06-22
+
+### Fixed
+- Updated function-agent-java to v1.1.0
+- Updated grel-functions-java to v0.9.1
+- Updated idlab-functions-java to v0.3.1
+- Updated junit to 5.9.1
+- Updated testcontainers to 1.17.6
+- Updated logback to 1.4.5
+- Updated Saxon-HE to 11.4
+- Updated postgresql to 42.5.1
+- Detect non existing files early ([issue 223](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/233))
+- Subject of LDES event stream has wrong IRI (internal GitLab issue [#253](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/253))
+- MS SQLServer JDBC driver was only for tests on classpath (internal GitLab issue [#255](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/255))
+- Normalising Double numbers from RDBs went wrong (internal GitLab issue [#256](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/256), GitHub issue [#206](https://github.com/RMLio/rmlmapper-java/issues/206))
+
+### Changed
+- `tree:view` and `ldes:retentionPolicy` are omitted when generating LDES metadata.
+
+### Added
+- A new Maven profile `no-buildnumber` disables using and updating `buildNumber.properties`.
+- Mocked DBpedia Spotlight service ([issue #250](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/250))
+- Update [dynamic-loading](https://github.com/RMLio/rmlmapper-java#dynamic-loading) in README.md
+
+## [6.1.3] - 2022-12-20
+
+### Fixed
+- Reraise execeptions from executor, so that CLI exits with non-zero exit code in the event of errors in execution ([issue 194](https://github.com/RMLio/rmlmapper-java/issues/194))
+
+## [6.1.2] - 2022-11-22
+
+## [6.1.1] - 2022-11-21
+
+## [6.1.0] - 2022-11-21
+
+### Changed
+- Require Java 11+
+- Port all tests to Junit 5
+- Database tests are executed with a fresh instance of the required database in a Docker container
+- Update of function libraries IDLab functions, GREL functions, Function Agent
+- Removed need for (deprecated) SecurityManager
+
+### Fixed
+- Dropped dependency on Guava
+- Dropped explicit dependency on Jetty
+- Dropped dependency on mariaDB4j
+- `RDF4JStore` had wrong regex to check for Literals when they have a language tag or data type.
+- Updated RDF4J to 4.2.1
+- Updated Jena to 4.6.1
+- Updated indirect dependencies to Xerces 2.12.2
+- Updated mysql-connector-java to 8.0.31
+- Updated postgresql to 42.5.0
+- Updated mssql-jdbc to 11.2.1.jre11
+- Updated com.fasterxml.jackson.core.* dependencies to 2.14.0
+- Updated jsoup to 1.15.3
+- Updated opencsv to 5.7.1
+- Updated poi-ooxml to 5.2.3
+- Updated testcontainers to 1.17.5
+- Updated mybatis to 3.5.11
+- Updated ojdbc8 21.6.0.0.1 to ojdbc11 21.7.0.0
+- Force Wiremock to use commons-fileupload 1.4
+- Main: Output paths can again be fully relative
+- Dropped dependency on com.spotify.docker-client ([issue 231](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/231))
+- Running multiple pipelines should no longer interfere with each other ([issue 245](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/245))
+- Fixed TriplesMaps detection of MappingConformer [issue 251](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/251)
+- `NamedNodeGenerator` now checks if the given IRI is valid ([issue 249](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/249))
+
+### Added
+- pom.xml: Added Testcontainers library dependencies for databases we test on
+- pom.xml: Added JUnit5 dependencies
+- Check for changelog changes in a separate lint stage during CI.
+
+## [6.0.0] - 2022-07-04
+
+### Changed
+- Run all tests in parallel on CI infrastructure
+- Upgrade Function Agent to v0.1.0
+
+### Fixed
+- Upgrade postgresql JDBC driver to 42.3.3
+- Rename `logback.xml` to `logback-test.xml` in test resources (see [issue 240](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/240))
+- If exception occurs while mapping data, already processed data gets written to output file
+- Properly close resources such as input streams
+- Github release notes are now properly extracted
+- Discard UTF Byte-Order-Marks (BOM) (see [issue 171](https://github.com/RMLio/rmlmapper-java/issues/171))
+- Dropped lib directory for functions as we now use a separate FnO Function Agent
+
+### Added
+- IDLabFunctions: added functions lookup and lookupWithDelimiter
+- IDLabFunctionsTest: added unit tests for lookup functions
+- IDLabFunctionsTest: relocate csv files used by tests for lookup function
+- IDLabFunctions: silence stack trace
+- CSVW: filter out rows with a comment prefix
+- Output file path now gets checked before the mapping
+- .gitignore: ignore vscode files
+- pom.xml: add Saxon-HE v11.3 dependency
+- XMLRecord: adjusted to use Saxon
+- XMLRecordFactory: adjusted to use Saxon
+- SaxNamespaceResolver: added class for resolving namespaces in Saxon. This fixes (#154)[https://github.com/RMLio/rmlmapper-java/issues/154].
+- Added unit tests for XPath 2/3 expressions and functions
+- Loggers across the codebase have been updated to use parameterized strings
+- Add support for WoT OAuth2 Security Scheme (see [issue 212](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/212))
+- Integration of independent function handler
+
+## [5.0.0] - 2022-03-11
+- TestCore: enable debug logs when VERBOSE env variable is set (see [issue 230](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/230))
+- Switched to fork of ODFtoolkit (see [issue 237](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/237))
+
+### Added
+
+- Add support for LDES Logical Target
+- Add support for generating unique reproducible IRIs for LDES
+
+### Changed
+
+- Write LDES state to disk when mapping execution is complete.
+- Removed deprecated execute() and executeWithFunction() methods, and refactored the executeV5() executeWithFunctionV5() method to execute() and executeWithFunction().
+
+### Fixed
+
+- Clarified Readme for quick start
+- No cartesian product when referring to the same logical source (see [issue 28](https://github.com/RMLio/rmlmapper-java/issues/28)])
+ - If you still want the cartesian product, update your mappings to refer to different logical sources with the same contents
+- Upgraded jetty-server and jetty-security to 9.4.44.v20210927
+- Upgraded wiremock-jre8 to 2.32.0
+- Upgraded ch.qos.logback to 1.2.10
+- Upgraded commons-cli to 1.5.0
+- Upgraded com.jayway.jsonpath to 2.7.0
+- Upgraded ch.vorburger.mariaDB4j to 2.5.3
+- Upgraded com.microsoft.sqlserver to 10.2.0.jre8
+- Upgraded com.fasterxml.jackson.core to 2.13.1
+- Upgraded org.jsoup to 1.14.3
+- Upgraded org.apache.poi to 5.0.0
+- Resources: functions_grel: use xsd:integer (see [issue 234](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/234))
+- Print error if referenceformulation is unsupported
+
+### Changed
+
+- Upgrade postgresql JDBC driver to 42.3.2 (see [issue 146](https://github.com/RMLio/rmlmapper-java/issues/146))
+
+## [4.15.0] - 2022-02-01
+
+### Fixed
+- Bump buildnumber during release (see [issue 227](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/227))
+- Always include xml: prefix (see [issue 144](https://github.com/RMLio/rmlmapper-java/issues/144))
+- `normalizeDate` function uses wrong pattern (see [issue 228](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/228))
+- CI: only publish `-all.jar` releases on Github (see [issue 145](https://github.com/RMLio/rmlmapper-java/issues/145))
+- CI: make use of templates
+
+### Changed
+- CSVRecordFactory: Replace Apache CSV library with OpenCSV to be able to differentiate between empty string and null (see [issue 140](https://github.com/RMLio/rmlmapper-java/issues/140))
+- CI: use Gitlab's own mirror feature instead of mirroring in a CI job.
+- CI: enforce CHANGELOG updates.
+- Added functions to normalize dates and datetimes.
+
+### Added
+- JSONRecordFactory: support JSONL files (see [issue 221](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/221)).
+
+## [4.14.3] - 2022-01-13
+
+### Fixed
+- Github CLI needs to specify a repo to create a release.
+
+## [4.14.2] - 2022-01-13
+
+### Fixed
+- Maven Central automatic builds fixed.
+- Upstream R2RML test cases.
+- Correctly install Github CLI in CI.
+
+## [4.14.1] - 2022-01-13
+
+### Fixed
+- Mirror development branch to Github when releasing new versions.
+- Github Release stage works now properly.
+- Build newer version during deployment.
+
+## [4.14.0] - 2022-01-13
+
+### Added
+- Mapper_Postgres_CSV_Test: Add test RMLTC1027 to check whether NULLs are ignored in PostgreSQL (see [issue 159](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/159))
+- IDLabFunctions: add isNull function (see [issue 219](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/219)).
+- Replaced PowerMock with WireMock (see [issue 45](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/45))
+- FunctionModel: Change the way Lists are processed to take into account generic types
+- CSVW: Add support for csvw:null (see [issue 217](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/217))
+- FnO: improve error messages for incomplete descriptions (see [issue 222](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/222))
+- CSVW: Ignore nulls instead of removing (see [issue 224](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/224))
+
+### Fixed
+- Update RELEASE.md with up-to-date notes for releasing new versions (see [issue 218](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/218)).
+- RELEASE: Fixed Maven Central deployment instructions (see [issue 223](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/223))
+- AccessFactory: Do not clean SPARQL queries by default (see [issue 214](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/214))
+
+## [4.13.0] - 2021-11-22
+
+### Fixed
+
+- update dependencies
+- cleaned up code
+- fixed undefined prefixes
+- CI: fix MS SQL Server docker image name
+- pom: mark Jena, Docker, Jetty and Fuseki as test dependencies (see [issue 127](https://github.com/RMLio/rmlmapper-java/issues/127))
+- XMLRecord: fallback to STRING if NODESET fails (see [issue 128](https://github.com/RMLio/rmlmapper-java/issues/128))
+- Tests: Updated RML test-cases 0002i and 0003a to no longer expect an error. (see [issue 130](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/130))
+- Tests: Added test case 0002k where no sqlVersion is present, as its presence is not mandatory.
+- README: mention [RML questions repository](https://github.com/kg-construct/rml-questions) (see [issue 216](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/216))
+- XML parsing: allow parsing of fully namespaced xml by injecting xml source's namespaces in the XPath compiler (see [issue 134](https://github.com/RMLio/rmlmapper-java/pull/134))
+- R2RML: No longer add sqlVersion 2008, as its presence is not mandatory.
+- CSVRecordFactory: allow empty column names (see [issue 124](https://github.com/RMLio/rmlmapper-java/issues/124))
+
+### Added
+
+- Main: add piping support of mapping rules (see [issue 124](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/124))
+- Logging: Log loaded functions when in verbose mode (see [issue 136](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/136))
+- Mapper_MySQL_R2RML_Test: Add information regarding non-compliance of MySQL for certain tests cases (see [issue 189](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/189))
+- Tests: Add test RMLTC1027 to check whether NULLs are ignored properly for various data sources (see [issue 159](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/159))
+
+## [4.12.0] - 2021-08-02
+
+### Fixed
+- R2RML: floating point differences between RDBs (see [issue 203](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/203))
+- R2RML: do not percent-encode binary data (see [issue 184](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/184))
+- R2RML: handle binary data differences between RDBs (see [issue 200](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/200))
+- Create an empty output file for empty JSON arrays as well (see [issue 98](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/98))
+- Always output UTF-8 encoded RDF (see [issue 119](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/119))
+- Refactor RDB records for better NULL and empty string handling (see [issue 131](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/131))
+- Align R2RML test cases with [kg-construct/r2rml-test-cases](https://github.com/kg-construct/r2rml-test-cases-support/pull/16) (see [issue 211](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/211))
+
+### Added
+- FunctionLoader: throw error on missing function parameters (see [issue 125](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/125))
+- HTMLRecordFactory: add CSS3 selector support (see [issue 52](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/52))
+- CSVRecordFactory: add spreadsheet support (see [issue 42](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/42))
+- IDLabFunctions: add slugify to default idlab-fn functions (see [issue 209](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/209))
+- RDBAccess: add XML support for PostgreSQL RDB (see [issue 51](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/51))
+- AccessFactory: add WoT BearerSecurity scheme (see [issue 195](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/195))
+- README: add clarification on where to find standalone release jars (see [issue 174](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/174))
+
+## [4.11.0] - 2021-07-05
+
+### Added
+- R2RML test cases (see [issue 192](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/192))
+- DCAT support
+
+### Fixed
+- R2RML support: handle booleans correctly (see [issue 187](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/187))
+- W3C Formats Namespace: use http instead of https
+
+## [4.10.1] - 2021-06-15
+
+### Fixed
+- README Markdown rendering and links
+- Follow HTTP redirects for Web APIs (see [issue 196](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/196))
+
+## [4.10.0] - 2021-05-05
+
+### Added
+- Added support for named graphs in RDFJStore.
+- Support for Logical Target and exporting to a local file with various
+serializations and compression, or a SPARQL endpoint using
+SPARQL UPDATE queries.
+- W3C Web of Things Web API access support to retrieve data from Web API
+with token authentication.
+
+### Changed
+- Use RDF4JStore by default (see [issue 108](https://github.com/RMLio/rmlmapper-java/issues/108)).
+- Public API of the Executor has been updated and is available under `V5`,
+the old API is still available but deprecated. In a future release, the old API
+will be removed and the new one will drop the `V5` suffix.
+
+### Fixed
+- Add remark about duplicate removal and serialization format performance (see [issue 108](https://github.com/RMLio/rmlmapper-java/issues/108)).
+- Treat empty values in CSV columns as NULL values in RDBs (see [issue 188](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/188)).
+- Fixed reloading the function every iteration, hopefully this gives a speed boost
+- Fix R2RML conversion of multiple Triples Maps (see [issue 186](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/186)).
+- Fix datatype retrieval when RDB colum names are quoted (see [issue 185](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/185)).
+
+## [4.9.4] - 2021-03-19
+
+### Changed
+- Link to our Docker images on Dockerhub in README (see [issue 109](https://github.com/RMLio/rmlmapper-java/issues/109))
+
+### Fixed
+- Support @ in JSONPath (see [issue 178](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/178))
+- JSONRecord: ignore 'null' values in JSONArray as well (see [issue 103](https://github.com/RMLio/rmlmapper-java/issues/103))
+
+## [4.9.3] - 2021-03-05
+
+### Fixed
+
+- Docker build (see [issue 106](https://github.com/RMLio/rmlmapper-java/issues/106))
+- Consistent builds with Maven
+
+## [4.9.2] - 2021-03-04
+
+### Changed
+
+- Endpoints of Oracle and DBpedia Spotlight for tests
+- getColumnLabel instead of getColumnName (see [issue 92](https://github.com/RMLio/rmlmapper-java/issues/92))
+- Updated dependencies
+ - added FnO Grel v0.6.1 which adds toTitlecase, lastIndexOfMapping, sha1, md5
+
+### Fixed
+
+- support SQL queries that have unnamed columns
+
+### Added
+- Add Logical Target support
+- Add Web of Things support
+- Add compression support
+
+## [4.9.1] - 2020-12-04
+
+### Added
+- Support commas in JSONPath
+
+### Fixed
+- Handling of boolean/any FnO parameters (see [MR 116](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/merge_requests/116))
+- Print descriptive error when mapping file does not exist or is invalid Turtle (see Github [issue 54](https://github.com/RMLio/rmlmapper-java/issues/54))
+- Print mapping file path as debug instead of a warning (see [issue 172](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/172))
+
+## [4.9.0] - 2020-09-14
+
+### Added
+- Add to Maven Central (see [issue 94](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/94))
+
+### Fixed
+- Fix CSVW with tab (see issues [168](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/168)
+and [169](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/169))
+
+## [4.8.2] - 2020-08-17
+
+### Added
+- Support function on SubjectMap that generates blank nodes (see [issue 167](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/167))
+
+### Changed
+- Updated licenses on the README
+
+### Fixed
+- Documentation updated to reflect metadata generation
+- Function objects with types other than String/Boolean don't get discarded (see [issue 165](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/165))
+- Generating metadata in different RDF format (see [issue 68](https://github.com/RMLio/rmlmapper-java/issues/68))
+
+## [4.8.1] - 2020-07-03
+
+### Changed
+- updated grel-functions-java to 0.5.2
+
+### Fixed
+- ObjectMap with type Blank Node is ignored (see [issue 164](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/164))
+- Support double quotes in references of RDBs (see [issue 163](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/163))
+
+## [4.8.0] - 2020-05-25
+
+### Added
+- Oracle driver information in README (see [issue 142](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/142))
+- Support Oracle databases (see [issue 160](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/160))
+
+### Changed
+- Functions support more datatypes: `be/ugent/rml/functions/FunctionUtils.java`
+
+### Removed
+- Oracle setup file (see [issue 161](https://gitlab.ilabt.imec.be/rml/proc/rmlmapper-java/-/issues/161))
+
+## [4.7.0] - 2020-03-09
+
+### Added
+
+- support for list-style parameter arguments for functions (see test `rml-fno-test-cases/RMLFNOTC0023-CSV`)
+
+### Changed
+
+- conform with latest spec
+ - the old way of describing a link to a JAVA library is currently still supported
+- usage of external GREL functions library
+ - by default, these _classes_ are loaded, _even when the function file parameter has another file_
+ - moved some functions to IDLabFunctions
+- FunctionLoader takes a `store` as constructor, not a file
+- for now, allow fallback on old FnO IRIs
+- dynamic function libraries (i.e., jars) are found relative to the cwd
+- renamed Utils::getInputStreamFromMOptionValue to Utils::getInputStreamFromFileOrContentString
+- changed URL of remote data file src/test/resources/test-cases/RMLTC1003-CSV/mapping.ttl
+- moved IDLabFunction tests to its canonical place
+- added idlab-fn:inRange function
+- in `TestFunctionCore`: `doPreloadMapping` just adds up to the existing `functions_idlab.ttl` descriptions to avoid duplication
+ - random generator defaults to "random_string_here" to avoid space characters.
+
## [4.6.0] - 2019-11-19
### Added
@@ -226,6 +846,49 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- support for accessing remote files (via HTTP GET)
- basic support for functions
+[8.1.0]: https://github.com/RMLio/rmlmapper-java/compare/v8.0.1...v8.1.0
+[8.0.1]: https://github.com/RMLio/rmlmapper-java/compare/v8.0.0...v8.0.1
+[8.0.0]: https://github.com/RMLio/rmlmapper-java/compare/v7.3.3...v8.0.0
+[7.3.3]: https://github.com/RMLio/rmlmapper-java/compare/v7.3.2...v7.3.3
+[7.3.2]: https://github.com/RMLio/rmlmapper-java/compare/v7.3.1...v7.3.2
+[7.3.1]: https://github.com/RMLio/rmlmapper-java/compare/v7.3.0...v7.3.1
+[7.3.0]: https://github.com/RMLio/rmlmapper-java/compare/v7.2.0...v7.3.0
+[7.2.0]: https://github.com/RMLio/rmlmapper-java/compare/v7.1.2...v7.2.0
+[7.1.2]: https://github.com/RMLio/rmlmapper-java/compare/v7.1.1...v7.1.2
+[7.1.1]: https://github.com/RMLio/rmlmapper-java/compare/v7.1.0...v7.1.1
+[7.1.0]: https://github.com/RMLio/rmlmapper-java/compare/v7.0.0...v7.1.0
+[7.0.0]: https://github.com/RMLio/rmlmapper-java/compare/v6.5.1...v7.0.0
+[6.5.1]: https://github.com/RMLio/rmlmapper-java/compare/v6.5.0...v6.5.1
+[6.5.0]: https://github.com/RMLio/rmlmapper-java/compare/v6.3.0...v6.5.0
+[6.3.0]: https://github.com/RMLio/rmlmapper-java/compare/v6.2.2...v6.3.0
+[6.2.2]: https://github.com/RMLio/rmlmapper-java/compare/v6.2.1...v6.2.2
+[6.2.1]: https://github.com/RMLio/rmlmapper-java/compare/v6.2.0...v6.2.1
+[6.2.0]: https://github.com/RMLio/rmlmapper-java/compare/v6.1.3...v6.2.0
+[6.1.3]: https://github.com/RMLio/rmlmapper-java/compare/v6.1.2...v6.1.3
+[6.1.2]: https://github.com/RMLio/rmlmapper-java/compare/v6.1.1...v6.1.2
+[6.1.1]: https://github.com/RMLio/rmlmapper-java/compare/v6.1.0...v6.1.1
+[6.1.0]: https://github.com/RMLio/rmlmapper-java/compare/v6.0.0...v6.1.0
+[6.0.0]: https://github.com/RMLio/rmlmapper-java/compare/v5.0.0...v6.0.0
+[5.0.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.15.0...v5.0.0
+[4.15.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.14.3...v4.15.0
+[4.14.3]: https://github.com/RMLio/rmlmapper-java/compare/v4.14.2...v4.14.3
+[4.14.2]: https://github.com/RMLio/rmlmapper-java/compare/v4.14.1...v4.14.2
+[4.14.1]: https://github.com/RMLio/rmlmapper-java/compare/v4.14.0...v4.14.1
+[4.14.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.13.0...v4.14.0
+[4.13.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.12.0...v4.13.0
+[4.12.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.11.0...v4.12.0
+[4.11.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.10.1...v4.11.0
+[4.10.1]: https://github.com/RMLio/rmlmapper-java/compare/v4.10.0...v4.10.1
+[4.10.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.9.3...v4.10.0
+[4.9.4]: https://github.com/RMLio/rmlmapper-java/compare/v4.9.3...v4.9.4
+[4.9.3]: https://github.com/RMLio/rmlmapper-java/compare/v4.9.2...v4.9.3
+[4.9.2]: https://github.com/RMLio/rmlmapper-java/compare/v4.9.1...v4.9.2
+[4.9.1]: https://github.com/RMLio/rmlmapper-java/compare/v4.9.0...v4.9.1
+[4.9.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.8.2...v4.9.0
+[4.8.2]: https://github.com/RMLio/rmlmapper-java/compare/v4.8.1...v4.8.2
+[4.8.1]: https://github.com/RMLio/rmlmapper-java/compare/v4.8.0...v4.8.1
+[4.8.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.7.0...v4.8.0
+[4.7.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.6.0...v4.7.0
[4.6.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.5.1...v4.6.0
[4.5.1]: https://github.com/RMLio/rmlmapper-java/compare/v4.5.0...v4.5.1
[4.5.0]: https://github.com/RMLio/rmlmapper-java/compare/v4.4.2...v4.5.0
diff --git a/CITATION.cff b/CITATION.cff
new file mode 100644
index 00000000..11df63e6
--- /dev/null
+++ b/CITATION.cff
@@ -0,0 +1,23 @@
+cff-version: 1.2.0
+message: "If you use this software, please cite it as below."
+authors:
+- family-names: "Heyvaert"
+ given-names: "Pieter"
+ orcid: "https://orcid.org/0000-0002-1583-5719"
+- family-names: "Van Assche"
+ given-names: "Dylan"
+ orcid: "https://orcid.org/0000-0002-7195-9935"
+- family-names: "De Meester"
+ given-names: "Ben"
+ orcid: "https://orcid.org/0000-0003-0248-0987"
+- family-names: "Haesendonck"
+ given-names: "Gerald"
+ orcid: "https://orcid.org/0000-0003-1605-3855"
+- family-names: "de Vleeschauwer"
+ given-names: "Els"
+ orcid: "https://orcid.org/0000-0002-8630-3947"
+- given-names: "Sitt Min Oo"
+ orcid: "https://orcid.org/0000-0001-9157-7507"
+title: "RMLMapper-JAVA"
+doi: 10.5281/zenodo.3929132
+url: "https://github.com/RMLio/rmlmapper-java"
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 608426ed..f58a25be 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,11 +1,16 @@
-FROM openjdk:8-alpine
+# Build image
+FROM maven:3.9.12-eclipse-temurin-21-alpine AS buildimage
-RUN apk add --no-cache git maven
ADD . /rmlmapper-java
-WORKDIR rmlmapper-java
-RUN mvn clean install -DskipTests=true
-RUN mv `find target/ -iname rmlmapper*.jar;` /rmlmapper.jar
+WORKDIR /rmlmapper-java
+RUN mvn -Pno-buildnumber clean package -DskipTests=true
+RUN mv $(readlink -f target/rmlmapper-*-all.jar) /rmlmapper.jar
+
+# "Runtime" image
+FROM eclipse-temurin:25-jre
+COPY --from=buildimage /rmlmapper.jar /rmlmapper.jar
+
WORKDIR /data
ENTRYPOINT ["java", "-jar", "/rmlmapper.jar"]
diff --git a/README.md b/README.md
index ac300e5d..74218ff9 100644
--- a/README.md
+++ b/README.md
@@ -1,64 +1,129 @@
-# RMLMapper
+# RMLMapper
-The RMLMapper execute RML rules to generate Linked Data.
-It is a Java library, which is available via the command line ([API docs online](https://rmlio.github.io/rmlmapper-java/apidocs/)).
+[](https://search.maven.org/search?q=g:%22be.ugent.rml%22%20AND%20a:%22rmlmapper%22)
+
+The RMLMapper executes RML rules to generate Linked Data.
+It is a Java library, which is available via the command line ([API docs online](https://javadoc.io/doc/be.ugent.rml/rmlmapper)).
The RMLMapper loads all data in memory, so be aware when working with big datasets.
-## Table of contents
+Want to get started quickly? Check out [Releases](#releases) on where to find the latest CLI build as a jar,
+and see [Usage](#cli) on how to use the commandline interface!
+
+## Table of contents
- [Features](#features)
+ - [Supported](#supported)
+ - [Future](#future)
+- [Releases](#releases)
- [Build](#build)
- [Usage](#usage)
- [CLI](#cli)
- [Library](#library)
- [Docker](#docker)
- [Including functions](#including-functions)
+ - [Generating metadata](#generating-metadata)
- [Testing](#testing)
+ - [Command line](#command-line)
+ - [IntelliJ](#intellij)
+ - [RDBs](#rdbs)
- [Dependencies](#dependencies)
+- [Commercial Support](#commercial-support)
- [Remarks](#remarks)
+ - [Typed spreadsheet files](#typed-spreadsheet-files)
+ - [XML file parsing performance](#xml-file-parsing-performance)
+ - [Language tag support](#language-tag-support)
+ - [Duplicate removal and serialization format](#duplicate-removal-and-serialization-format)
+ - [I have a question! Where can I get help?](#i-have-a-question-where-can-i-get-help)
- [Documentation](#documentation)
- [UML Diagrams](#uml-diagrams)
## Features
### Supported
+
- local data sources:
- - CSV files (including CSVW)
- - JSON files (JSONPath)
- - XML files (XPath)
-- remote data sources:
- - relational databases (MySQL, PostgreSQL, and SQLServer)
- - SPARQL endpoints
- - files via HTTP urls (via GET)
+ - Excel (.xlsx)
+ - LibreOffice (.ods)
- CSV files
- - JSON files (JSONPath)
+ - including CSVW, for an overview of which parts of CSVW are supported, have a look at the [test cases, introduced in v4.4.0](https://github.com/RMLio/rmlmapper-java/tree/master/src/test/resources/test-cases-CSVW)
+ - JSON files (JSONPath (`@` can be used to select the current object.))
- XML files (XPath)
+- remote data sources:
+ - relational databases (MySQL, PostgreSQL, Oracle, and SQLServer)
+ - Web APIs with W3C Web of Things, see [an exemplary test case, introduced in v4.13.0](https://github.com/RMLio/rmlmapper-java/blob/master/src/test/resources/web-of-things/logical-target/sparql/mapping.ttl)
+ - SPARQL endpoints
+ - files via HTTP urls (via GET)
+ - CSV files, see [an exemplary test case, introduced in v0.1.0](https://github.com/RMLio/rmlmapper-java/blob/master/src/test/resources/test-cases/RMLTC1003-CSV/mapping.ttl)
+ - JSON files (JSONPath (`@` can be used to select the current object.))
+ - XML files (XPath)
- functions (most cases)
+ - For examples on how to use functions within RML mapping documents, you can have a look at the [RML+FnO test cases](https://github.com/RMLio/rml-fno-test-cases)
+ - Notable function examples include
+ - SHA1 and MD5 functions, see [this comment on issue 100](https://github.com/RMLio/rmlmapper-java/issues/100#issuecomment-826547387)
+ - Lookup function, see [this comment on issue 200](https://github.com/RMLio/rmlmapper-java/issues/220#issuecomment-1754422677)
- configuration file
- metadata generation
-- output formats: nquads (default), turtle, trig, trix, jsonld, hdt
- join conditions
+- output formats: nquads (default), turtle, trig, trix, jsonld, hdt, [jelly](https://w3id.org/jelly)
+- targets:
+ - local file
+ - VoID dataset
+ - SPARQL endpoint with SPARQL UPDATE
+ - [HTTP request access](https://rml.io/specs/access/httprequest/)
+ - [dynamic logical targets](https://rml.io/specs/target/dynamictarget/)
+
+All functionalities above refer to using RML as maintained at .
+There is _some_ support for RML as developed within W3C's [Knowledge Graph Construction Community Group](https://www.w3.org/community/kg-construct/), for a recent view, see the [test cases, support introduced in v7.0.0](https://github.com/RMLio/rmlmapper-java/tree/master/src/test/resources/new-test-cases).
### Future
+
- functions (all cases)
- conditions (all cases)
+- logical views
+ - Currently, this can be mitigated: we maintain a preprocessor to support this: [RML-view-to-CSV](https://github.com/RMLio/rml-view-to-csv).
- data sources:
- - NoSQL databases
- - web APIs
- - TPF servers
+ - NoSQL databases
+ - TPF servers
+ - [HTTP request access](https://rml.io/specs/access/httprequest/)
+ - dynamic logical source
+ - Currently, this can be mitigated: RMLMapper allows to use the commandline interface to combine multiple mapping rules, so you could script it, for more info, see [issue 161](https://github.com/RMLio/rmlmapper-java/issues/161).
+
+## Releases
+
+The standalone jar file (that has a [commandline interface](#cli)) for every release can be found on the release's page on GitHub.
+You can find the latest release on [the dedicated RMLMapper-JAVA Github release page](https://github.com/RMLio/rmlmapper-java/releases/latest).
+This is the recommended way to get started with RMLMapper.
+Do you want to build from source yourself? Check [Build](#build).
## Build
-The RMLMapper is build using Maven: `mvn install`.
+
+The RMLMapper is built using Maven.
+As it is also tested against Oracle (check [the RDB documentation below](#rdbs) for details),
+it needs a specific set-up to run all tests.
+That's why we recommend to build without testing: `mvn install -DskipTests=true`.
+If you want, you can install with tests, and just skip the Oracle tests: `mvn test -Dtest=!Mapper_OracleDB_Test`.
+
A standalone jar can be found in `/target`.
+Two jars are found in `/target`: a slim jar without bundled dependencies, and a standalone jar (suffixed with `-all.jar`) with all dependencies bundled.
+
+Building with profile `no-buildnumber` disables using and updating `buildNumber.properties` (and uses `0` as build number), e.g.:
+
+```bash
+mvn clean package -P no-buildnumber
+```
+
+outputs for example `target/rmlmapper--r0.jar`
+
## Usage
### CLI
+
The following options are most common.
- `-m, --mapping `: one or more mapping file paths and/or strings (multiple values are concatenated).
- `-o, --output `: path to output file
-- `-s,--serialization `: serialization format (nquads (default), trig, trix, jsonld, hdt)
+- `-s,--serialization `: serialization format (nquads (default), trig, trix, jsonld, hdt, [jelly](https://w3id.org/jelly))
All options can be found when executing `java -jar rmlmapper.jar --help`,
that output is found below.
@@ -66,31 +131,66 @@ that output is found below.
```
usage: java -jar mapper.jar
options:
- -c,--configfile path to configuration file
- -d,--duplicates remove duplicates in the output
- -dsn,--r2rml-jdbcDriver DSN of the database when using R2RML rules
- -e,--metadatafile path to output metadata file
- -f,--functionfile path to functions.ttl file (dynamic
- functions are found relative to
- functions.ttl)
- -h,--help show help info
- -l,--metadataDetailLevel generate metadata on given detail level
- (dataset - triple - term)
- -m,--mappingfile one or more mapping file paths and/or
- strings (multiple values are
- concatenated). r2rml is converted to rml
- if needed using the r2rml arguments.
- -o,--outputfile path to output file (default: stdout)
- -p,--r2rml-password password of the database when using R2RML rules
- -s,--serialization serialization format (nquads (default),
- turtle, trig, trix, jsonld, hdt)
- -t,--triplesmaps IRIs of the triplesmaps that should be
- executed in order, split by ',' (default
- is all triplesmaps)
- -u,--r2rml-username username of the database when using R2RML rules
- -v,--verbose show more details in debugging output
+ -b,--base-iri Base IRI used to expand relative IRIs
+ in generated terms in the output.
+ -c,--configfile path to configuration file
+ --convert-mapping Only convert the mapping to the
+ latest RML specification by the W3C
+ Community Group
+ -d,--duplicates remove duplicates in the HDT,
+ N-Triples, or N-Quads output
+ --disable-automatic-eof-marker Setting this option assumes input
+ data has a kind of End-of-File
+ marker. Don't use unless you're
+ absolutely sure what you're doing!
+ -dsn,--r2rml-jdbcDSN DSN of the database when using R2RML
+ rules
+ -e,--metadatafile path to output metadata file
+ -f,--functionfile one or more function file paths
+ (dynamic functions with relative
+ paths are found relative to the cwd)
+ -h,--help show help info
+ -l,--metadataDetailLevel generate metadata on given detail
+ level (dataset - triple - term)
+ -m,--mappingfile one or more mapping file paths and/or
+ strings (multiple values are
+ concatenated). r2rml is converted to
+ rml if needed using the r2rml
+ arguments.RDF Format is determined
+ based on extension.
+ -o,--outputfile path to output file (default: stdout)
+ -p,--r2rml-password password of the database when using
+ R2RML rules
+ -psd,--privatesecuritydata one or more private security files
+ containing all private security
+ information such as usernames,
+ passwords, certificates, etc.
+ -s,--serialization serialization format (nquads
+ (default), turtle, trig, trix,
+ jsonld, hdt, jelly)
+ --strict Enable strict mode. In strict mode,
+ the mapper will fail on invalid IRIs
+ instead of skipping them.
+ -t,--triplesmaps IRIs of the triplesmaps that should
+ be executed in order, split by ','
+ (default is all triplesmaps)
+ -u,--r2rml-username username of the database when using
+ R2RML rules
+ -v,--verbose show more details in debugging output
```
+#### Accessing Web APIs with authentication
+
+The [W3C Web of Things Security Ontology](https://www.w3.org/2019/wot/security)
+is used to describe how Web APIs authentication should be performed
+but does not include the necessary credentials to access the Web API.
+These credentials can be supplied using the `-psd ` CLI argument.
+The `PATH` argument must point to one or more private security files
+which contain the necessary credentials to access the Web API.
+
+An example can be found in the test cases
+[src/test/resources/web-of-things](src/test/resources/web-of-things).
+
### Library
An example of how you can use the RMLMapper as an external library can be found
@@ -98,6 +198,13 @@ at [./src/test/java/be/ugent/rml/readme/ReadmeTest.java](https://github.com/RMLi
### Docker
+#### Dockerhub
+
+We publish our Docker images automatically on Dockerhub for every release.
+You can find our images here: [rmlio/rmlmapper-java](https://hub.docker.com/r/rmlio/rmlmapper-java).
+
+#### Build image
+
You can use Docker to run the RMLMapper by following these steps:
- Build the Docker image: `docker build -t rmlmapper .`.
@@ -108,37 +215,71 @@ The RMLMapper is executed in the `/data` folder in the Docker container.
### Including functions
-There are two ways to include (new) functions within the RML Mapper
- * dynamic loading: you add links to java files or jar files, and those files are loaded dynamically at runtime
- * preloading: you register functionality via code, and you need to rebuild the mapper to use that functionality
+There are three ways to include (new) functions within the RML Mapper
+
+- dynamic loading: you add links to java files or jar files, and those files are loaded dynamically at runtime
+- preloading: you register functionality via code, and you need to rebuild the mapper to use that functionality
+- add as dependency
Registration of functions is done using a Turtle file, which you can find in `src/main/resources/functions.ttl`
-The snippet below for example links an fno:function to a library, provided by a jar-file (`GrelFunctions.jar`).
+#### Dynamic loading
-```
-grel:toUpperCase a fno:Function ;
- fno:name "to Uppercase" ;
- rdfs:label "to Uppercase" ;
- dcterms:description "Returns the input with all letters in upper case." ;
+Create a Turtle file that describe the functions that need to be included and add the jar which contains those functions.
+
+> Note: the java or jar-files are found relative to the cwd.
+You can change the functions.ttl path (or use multiple functions.ttl paths) using a commandline-option (`-f`).
+
+For example the snippets below dynamically link an fno:Function to a library, provided by a jar-file (`CustomFunctions.jar`). The example links a function that parses the latitude (`50.2`) out of the following string `"POINT (50.2 5.3)"`.
+
+ `functions.ttl` contains the description of the function in Turtle:
+
+```turtle
+@prefix dcterms: .
+@prefix doap: .
+@prefix fno: .
+@prefix fnoi: .
+@prefix fnom: .
+@prefix grel: .
+@prefix grelm: .
+@prefix rdfs: .
+
+grel:parsePointLat a fno:Function ;
+ fno:name "parsePointLat" ;
+ rdfs:label "parsePointLat" ;
+ dcterms:description "Parse the latitude from a point." ;
fno:expects ( grel:valueParam ) ;
- fno:returns ( grel:stringOut ) ;
- lib:providedBy [
- lib:localLibrary "GrelFunctions.jar";
- lib:class "GrelFunctions";
- lib:method "toUppercase"
- ].
+ fno:returns ( grel:stringOut ) .
+
+grelm:javaString
+ a fnoi:JavaClass ;
+ doap:download-page "CustomFunctions.jar" ;
+ fnoi:class-name "CustomFunctions" .
+
+grelm:parsePointLat
+ a fno:Mapping ;
+ fno:function grel:parsePointLat ;
+ fno:implementation grelm:javaString ;
+ fno:methodMapping [ a fnom:Function ;
+ fnom:method-name "parsePointLat" ] .
```
-#### Dynamic loading
+The accompanying java file `CustomFunctions.java`:
-Just put the java or jar-file in the resources folder,
-at the root folder of the jar-location,
-or the parent folder of the jar-location,
-it will be found dynamically.
+```java
+public class CustomFunctions {
+ public static String parsePointLat(String s) {
+ return s.replace("POINT ", "").replace('(', ' ').replace(')', ' ').trim().split("\\s+")[0];
+ }
+}
+```
-> Note: the java or jar-files are found relative to the loaded functions.ttl.
-You can change the functions.ttl path using a commandline-option (`-f`).
+To dynamically include the custom function, compile the java-file and include `functions.ttl` with the `-f` option:
+
+```bash
+javac CustomFunctions.java && jar cvf CustomFunctions.jar CustomFunctions.class
+java -jar mapper.jar -f functions.ttl
+```
#### Preloading
@@ -146,38 +287,107 @@ This overrides the dynamic loading.
An example of how you can use Preload a custom function can be found
at [./src/test/java/be/ugent/rml/readme/ReadmeFunctionTest.java](https://github.com/RMLio/rmlmapper-java/blob/master/src/test/java/be/ugent/rml/readme/ReadmeFunctionTest.java)
+#### Adding as dependency
+
+This is most interesting if you use RMLMapper as a library in your own project.
+Just add the dependency to the function library you want to use in your project.
+
+You can also add a function library as a Maven dependency in `pom.xml` of RMLMapper.
+You'll have to rebuild RMLMapper to use it.
+
+### Generating metadata
+
+Conform to how it is described in the scientific paper [1],
+the RMLMapper allows to automatically generate [PROV-O](https://www.w3.org/TR/prov-o/) metadata.
+Specifically, you need the CLI arguments below.
+You can specify in which output file the metadata should be stored,
+and up to which level metadata should be stored (dataset, triple, or term level metadata).
+
+```
+ -e,--metadatafile path to output metadata file
+ -l,--metadataDetailLevel generate metadata on given detail level
+ (dataset - triple - term)
+```
+
## Testing
+### Command line
+
+Run the tests via `test.sh`.
+
+### IntelliJ
+
+Right-click `src/test/java` directory and select "Run 'All tests'".
+
+#### Derived tests
+
+Some tests (Excel, ODS) are derived from other tests (CSV) using a script (`./generate_spreadsheet_test_cases.sh`)
+
### RDBs
-Make sure you have [Docker](https://www.docker.com) running.
+
+Make sure you have [Docker](https://www.docker.com) running. On Unix, others read-write permission (006) is required on `/var/run/docker.sock` in order to run the tests.
+The tests will fail otherwise, as Testcontainers can't spin up the container.
#### Problems
-* A problem with Docker (can't start the container) causes the SQLServer tests to fail locally. These tests will always succeed locally.
-* A problem with Docker (can't start the container) causes the PostgreSQL tests to fail locally on Windows 7 machines.
+
+- A problem with Docker (can't start the container) causes the SQLServer tests to fail locally. These tests will always succeed locally.
+- A problem with Docker (can't start the container) causes the PostgreSQL tests to fail locally on Windows 7 machines.
## Dependencies
-| Dependency | License |
-|:----------------------------------:|--------------------------------------------------------------------|
-| com.spotify docker client | Apache License 2.0 |
-| com.h2database h2 | Eclipse Public License 1.0 & Mozilla Public License 2.0 |
-| com.googlecode.zohhak | GNU Lesser General Public License v3.0 |
-| com.microsoft.sqlserver mssql-jdbc | MIT |
-| ch.vorbuger.mariaDB4j | Apache License 2.0 |
-| mysql-connector-java | GNU General Public License v2.0 |
-| com.google.guava | Apache License 2.0 |
-| javax.xml.parsers jaxp-api | Apache License 2.0 |
-| com.jayway.jsonpath | Apache License 2.0 |
-| junit | Eclipse Public License 1.0 |
-| org.eclipse.rdf4j rdf4j-runtime | Eclipse Public License 1.0 |
-| commons-cli | Apache License 2.0 |
-| commons-csv | Apache License 2.0 |
-| commons-lang | Apache License 2.0 |
-| ch.qos.logback | Eclipse Public License 1.0 & GNU Lesser General Public License 2.1 |
-| org.rdfhdt.hdt-jena | GNU Lesser General Public License v3.0 |
+| Dependency | License |
+|:--------------------------------------:|--------------------------------------------------------------------|
+| ch.qos.logback logback-classic | Eclipse Public License 1.0 & GNU Lesser General Public License 2.1 |
+| com.github.fnoio function-agent-java | MIT |
+| com.github.fnoio grel-functions-java | MIT |
+| com.github.fnoio idlab-functions-java | MIT |
+| com.github.rdfhdt hdt-java | GNU Lesser General Public License v3.0 |
+| com.github.tomakehurst:wiremock-jre8 | Apache License 2.0 |
+| com.google.protobuf protobuf-java | BSD 3-clause |
+| com.microsoft.sqlserver mssql-jdbc | MIT |
+| com.mysql mysql-connector-java | GNU General Public License v2.0 |
+| com.oracle.database.jdbc:ojdbc11 | Oracle Free Use Terms and Conditions |
+| eu.neverblink.jelly jelly-core | Apache License 2.0 |
+| eu.neverblink.jelly jelly-rdf4j | Apache License 2.0 |
+| net.minidev json-smart | Apache License 2.0 |
+| org.apache.jena fuseki-main | Apache License 2.0 |
+| org.eclipse.rdf4j rdf4j-client | Eclipse Distribution License v1.0 |
+| org.junit.jupiter junit-jupiter-api | Eclipse Public License v2.0 |
+| org.junit.jupiter junit-jupiter-engine | Eclipse Public License v2.0 |
+| org.junit.jupiter junit-jupiter-params | Eclipse Public License v2.0 |
+| org.junit.vintage junit-vintage-engine | Eclipse Public License v2.0 |
+| org.postgresql postgresql | BSD |
+| org.testcontainers jdbc | MIT |
+| org.testcontainers junit-jupiter | MIT |
+| org.testcontainers mssqlserver | MIT |
+| org.testcontainers mysql | MIT |
+| org.testcontainers oracle-xe | MIT |
+| org.testcontainers postgresql | MIT |
+
+## Commercial Support
+
+Do you need...
+
+- training?
+- specific features?
+- different integrations?
+- bugfixes, on _your_ timeline?
+- custom code, built by experts?
+- commercial support and licensing?
+
+You're welcome to [contact us](mailto:info@rml.io) regarding
+on-premise, enterprise, and internal installations, integrations, and deployments.
+
+We have commercial support available.
+
+We also offer consulting for all-things-RML.
## Remarks
+### Typed spreadsheet files
+
+All spreadsheet files are as of yet regarded as plain CSV files. No type information like Currency, Date... is used.
+
### XML file parsing performance
The RMLMapper's XML parsing implementation (`javax.xml.parsers`) has been chosen to support full XPath.
@@ -189,24 +399,48 @@ However, the RMLMapper can be easily adapted to use a different XML parsing impl
The processor checks whether correct language tags are not, using a regular expression.
The regex has no support for languages of length 5-8, but this currently only applies to 'qaa..qtz'.
+### Duplicate removal and serialization format
+
+Performance depends on the serialization format (`--serialization `)
+and if duplicate removal is enabled (`--duplicates`).
+Experimenting with various configurations may lead to better performance for
+your use case.
+
+### I have a question! Where can I get help?
+
+Do you have any question related to writing RML mapping rules,
+the RML specification, etc., feel free to ask them
+here: !
+If you have found a bug or need a feature for the RMLMapper itself,
+you can make an issue in this repository.
+
## Documentation
+
Generate static files at /docs/apidocs with:
-```
+
+```bash
mvn javadoc:javadoc
```
### UML Diagrams
#### Architecture UML Diagram
+
##### How to generate with IntelliJ IDEA
+
(Requires Ultimate edition)
-* Right click on package: "be.ugent.rml"
-* Diagrams > Show Diagram > Java Class Diagrams
-* Choose what properties of the classes you want to show in the upper left corner
-* Export to file > .png | Save diagram > .uml
+- Right click on package: "be.ugent.rml"
+- Diagrams > Show Diagram > Java Class Diagrams
+- Choose what properties of the classes you want to show in the upper left corner
+- Export to file > .png | Save diagram > .uml
#### Sequence Diagram
+
##### Edit on [draw.io](https://www.draw.io)
-* Go to [draw.io](https://www.draw.io)
-* Click on 'Open Existing Diagram' and choose the .html file
+
+- Go to [draw.io](https://www.draw.io)
+- Click on 'Open Existing Diagram' and choose the .html file
+
+[1]: A. Dimou, T. De Nies, R. Verborgh, E. Mannens, P. Mechant, and R. Van de Walle, “Automated metadata generation for linked data generation and publishing workflows,†in Proceedings of the 9th Workshop on Linked Data on the Web, Montreal, Canada, 2016, pp. 1–10.
+[PDF](http://events.linkeddata.org/ldow2016/papers/LDOW2016_paper_04.pdf)
diff --git a/RELEASE.md b/RELEASE.md
new file mode 100644
index 00000000..72f1ab46
--- /dev/null
+++ b/RELEASE.md
@@ -0,0 +1,72 @@
+# Release process
+
+## Automated
+
+1. Go to Gitlab's Pipelines in the repository.
+2. Click on the grey job with an arrow in it (`development` branch).
+3. Click on 'Create Release' manually job of the pipeline, not on the play button!
+4. Enter the following key-value variable:
+ - Key: `RELEASE_TAG_NAME`
+ - Value: The git tag you want, for example: `1.2.3`
+5. Press 'Run job'
+
+All release steps are automatically executed including syncing the `master` branch, git tags, Maven, Docker, etc.
+Once the job completes, make manually a GitHub Release from the tag your created on GitHub.
+
+## Manually
+
+### Release branch and tags
+
+1. Make a new release branch (named `release/X.Y.Z`)
+2. Bump version number in `pom.xml`
+3. Update the changelog with the release name, use [ChangeFrog](https://github.com/pheyvaer/changefrog) to avoid mistakes.
+4. Run `mvn clean install -DskipTests=True` to generate a fat jar.
+5. Create a merge request from the `release/X.Y.Z` branch to the `development` branch and merge it if all tests pass.
+6. Repeat this for `development` to `master`.
+7. Create a git tag: `git tag $TAG` on `master`.
+8. Push tag: `git push --tags`
+
+### Docker image
+
+1. Run `docker build -t rmlio/rmlmapper-java:$TAG .` to generate a Docker image for your `$TAG`.
+2. Repeat this for the `latest` tag: `docker build -t rmlio/rmlmapper-java:latest`
+3. Push Docker images to Docker Hub: `docker push rmlio/rmlmapper-java:$TAG` and `docker push rmlio/rmlmapper-java:latest`.
+
+### Deploy on Central Repository
+
+The following steps deploy a new version to the Central Repository,
+based on [this tutorial](https://central.sonatype.org/pages/apache-maven.html).
+
+1. Check if `~/.m2/settings.xml` exists.
+2. If so, add the content of `settings.example.xml` to it, else
+copy `settings.example.xml` to `~/.m2/settings.xml`.
+3. Fill in your JIRA user name and password in `settings.xml`.
+4. Fill in your GPG passphrase. Find more information about setting up your key [here](https://central.sonatype.org/pages/working-with-pgp-signatures.html).
+5. Make sure `JAVA_HOME` is properly set for your setup. Example: `export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64`
+6. Deploy the latest release via `mvn clean deploy -P release -DskipTests=true`.
+
+### Create a release on Github
+
+1. Update the `master` and `development` branches on Github.
+2. Go to the Github repo and make a new release.
+3. Select the tag you created earlier.
+4. Add the content of `CHANGELOG.md` in the release notes
+5. Append the fat jar you generated earlier as release binaries
+
+### Create a Merge Request to Alpine Linux's aports
+
+1. Make sure you have `pmbootstrap` installed and ran `pmbootstrap init`, see https://wiki.postmarketos.org/wiki/Installing_pmbootstrap#Installing_automatically
+3. Fork and clone aports: https://gitlab.alpinelinux.org/alpine/aports
+4. Copy `APKBUILD` file of the rmlmapper in `testing/rmlmapper` to `~/.local/var/pmbootstrap/cache_git/pmaports/temp/rmlmapper/`. You might need to create the `rmlmapper` directory.
+5. Update the version number in the `APKBUILD` file.
+6. Run `pmbootstrap checksum rmlmapper`. This will update the SHA512 checksums.
+7. Check if everything builds: `pmbootstrap build rmlmapper`
+8. If it passes, copy the `APKBUILD` file back to `aports/testing/rmlmapper`
+9. Create a new commit in the `aports` git repo with title: `testing/rmlmapper: update to $TAG`
+10. Push to your fork and create a Merge Request in Alpine Linux's Gitlab.
+11. If the CI properly passes, maintainers will merge it in the next few hours or days.
+
+### Re-run the R2RML implementation report test cases
+
+1. Re-run them for this `$TAG`
+2. Make a merge request to the `rmlio` website
diff --git a/build-release.sh b/build-release.sh
new file mode 100755
index 00000000..d0d49673
--- /dev/null
+++ b/build-release.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+apk add java-jre-headless maven java-jdk
+mvn install -DskipTests=true
diff --git a/buildNumber.properties b/buildNumber.properties
index 123f434c..a30686cb 100644
--- a/buildNumber.properties
+++ b/buildNumber.properties
@@ -1,3 +1,3 @@
#maven.buildNumber.plugin properties file
-#Tue Nov 19 11:48:03 CET 2019
-buildNumber0=144
+#Thu Dec 11 14:28:34 CET 2025
+buildNumber0=379
diff --git a/bump-patch.sh b/bump-patch.sh
deleted file mode 100755
index b3d4494b..00000000
--- a/bump-patch.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-mvn validate
-mvn compile
-mvn test
-mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit
-
-echo "Don't forget to change the CHANGELOG"
diff --git a/bump.sh b/bump.sh
new file mode 100644
index 00000000..14b4be8c
--- /dev/null
+++ b/bump.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+mvn validate
+mvn compile
+mvn test
+
+# patch
+# mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit
+# minor
+# mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.nextMinorVersion}.\${parsedVersion.incrementalVersion} versions:commit
+# major
+# mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.nextMajorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.incrementalVersion} versions:commit
+
+echo "Don't forget to change the CHANGELOG"
diff --git a/data/r2rml-test-cases-config-mysql.ini b/data/r2rml-test-cases-config-mysql.ini
new file mode 100644
index 00000000..10325c35
--- /dev/null
+++ b/data/r2rml-test-cases-config-mysql.ini
@@ -0,0 +1,18 @@
+[tester]
+tester_name: Dylan Van Assche
+tester_url: https://rml.io/
+tester_contact: dylan.vanassche@ugent.be
+
+[engine]
+test_date: DATE
+engine_version: VERSION
+engine_name: RMLMapper
+engine_created: 2018-04-18
+engine_url: https://github.com/rmlio/rmlmapper-java
+
+[properties]
+database_system: mysql
+tests: all
+output_results: ./output.nq
+output_format: nquads
+engine_command: java -jar ../target/rmlmapper-*-all.jar -d -s nquads -m ./r2rml.ttl -dsn jdbc:mysql://docker:3306/r2rml -u r2rml -p r2rml -o ./output.nq
diff --git a/data/r2rml-test-cases-config-postgresql.ini b/data/r2rml-test-cases-config-postgresql.ini
new file mode 100644
index 00000000..15a50075
--- /dev/null
+++ b/data/r2rml-test-cases-config-postgresql.ini
@@ -0,0 +1,18 @@
+[tester]
+tester_name: Dylan Van Assche
+tester_url: https://rml.io/
+tester_contact: dylan.vanassche@ugent.be
+
+[engine]
+test_date: DATE
+engine_version: VERSION
+engine_name: RMLMapper
+engine_created: 2018-04-18
+engine_url: https://github.com/rmlio/rmlmapper-java
+
+[properties]
+database_system: postgresql
+tests: all
+output_results: ./output.nq
+output_format: nquads
+engine_command: java -jar ../target/rmlmapper-*-all.jar -d -s nquads -m ./r2rml.ttl -dsn jdbc:postgresql://docker:5432/r2rml -u r2rml -p r2rml -o ./output.nq
diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml
deleted file mode 100644
index 5f5daeeb..00000000
--- a/dependency-reduced-pom.xml
+++ /dev/null
@@ -1,185 +0,0 @@
-
-
- 4.0.0
- be.ugent.rml
- rmlmapper
- 4.5.1
-
- scm:git:ssh://git@github.com:RMLio/rmlmapper-java.git
- https://github.com/RMLio/rmlmapper-java
-
-
- src/main/java
- src/test/java
- ${project.artifactId}-${project.version}-r${buildNumber}
-
-
- maven-compiler-plugin
- 3.8.1
-
- ${maven.compiler.source}
- ${maven.compiler.source}
-
-
-
- maven-javadoc-plugin
- 3.1.0
-
-
- attach-javadocs
- install
-
- javadoc
-
-
- public
- docs
- false
- none
-
-
-
-
- docs
- en
-
-
-
- maven-shade-plugin
- 3.2.1
-
-
- make-assembly
- package
-
- shade
-
-
-
-
- false
-
-
- be.ugent.rml.cli.Main
-
-
-
-
- false
-
-
-
-
- *:*
-
- META-INF/*.SF
- META-INF/*.DSA
- META-INF/*.RSA
-
-
-
-
-
-
- maven-surefire-plugin
- 3.0.0-M3
-
- true
- false
-
-
-
- org.codehaus.mojo
- buildnumber-maven-plugin
- 1.4
-
-
- validate
-
- create
-
-
-
-
- {0,number}
-
- buildNumber0
-
-
-
-
-
-
-
- repo.maven.apache.org
- https://repo.maven.apache.org/maven2/
-
-
- jitpack.io
- https://jitpack.io
-
-
-
-
- junit
- junit
- 4.12
- test
-
-
- hamcrest-core
- org.hamcrest
-
-
-
-
- ch.vorburger.mariaDB4j
- mariaDB4j
- 2.4.0
- test
-
-
- mariaDB4j-core
- ch.vorburger.mariaDB4j
-
-
- mariaDB4j-db-linux64
- ch.vorburger.mariaDB4j
-
-
- mariaDB4j-db-win32
- ch.vorburger.mariaDB4j
-
-
- mariaDB4j-db-mac64
- ch.vorburger.mariaDB4j
-
-
-
-
- com.microsoft.sqlserver
- mssql-jdbc
- 7.2.2.jre8
- test
-
-
- com.googlecode.zohhak
- zohhak
- 1.1.1
- test
-
-
- org.apache.jena
- apache-jena-libs
- 3.8.0
- pom
- compile
-
-
-
- 8
- 8
- UTF-8
- 4.12
-
-
diff --git a/docs/apidocs/allclasses-frame.html b/docs/apidocs/allclasses-frame.html
deleted file mode 100644
index 7e92f931..00000000
--- a/docs/apidocs/allclasses-frame.html
+++ /dev/null
@@ -1,93 +0,0 @@
-
-
-
-
-
-
-All Classes (rmlmapper 4.5.0 API)
-
-
-
-
-
-
Returns an array containing the constants of this enum type, in
-the order they are declared. This method may be used to iterate
-over the constants as follows:
-
-for (DatabaseType.Database c : DatabaseType.Database.values())
- System.out.println(c);
-
-
-
Returns:
-
an array containing the constants of this enum type, in the order they are declared
Returns the enum constant of this type with the specified name.
-The string must match exactly an identifier used to declare an
-enum constant in this type. (Extraneous whitespace characters are
-not permitted.)
-
-
Parameters:
-
name - the name of the enum constant to be returned.
Returns an array containing the constants of this enum type, in
-the order they are declared. This method may be used to iterate
-over the constants as follows:
-
-for (TEMPLATETYPE c : TEMPLATETYPE.values())
- System.out.println(c);
-
-
-
Returns:
-
an array containing the constants of this enum type, in the order they are declared
Returns the enum constant of this type with the specified name.
-The string must match exactly an identifier used to declare an
-enum constant in this type. (Extraneous whitespace characters are
-not permitted.)
-
-
Parameters:
-
name - the name of the enum constant to be returned.
This method parse the generic template and returns a list of Extractors
- that can later be used by the executor
- to get the data values from the records.
This method parse the generic template and returns a list of Extractors
- that can later be used by the executor
- to get the data values from the records.
This methods returns the datatypes of the file.
- This method always returns null, because the datatypes can't be determined from a local file for the moment.
This methods returns the datatypes of the file.
- This method always returns null, because the datatypes can't be determined from a remote file for the moment.
This method parse the generic template and returns a list of Extractors
- that can later be used by the executor
- to get the data values from the records.
Returns an array containing the constants of this enum type, in
-the order they are declared. This method may be used to iterate
-over the constants as follows:
-
-for (MetadataGenerator.DETAIL_LEVEL c : MetadataGenerator.DETAIL_LEVEL.values())
- System.out.println(c);
-
-
-
Returns:
-
an array containing the constants of this enum type, in the order they are declared
Returns the enum constant of this type with the specified name.
-The string must match exactly an identifier used to declare an
-enum constant in this type. (Extraneous whitespace characters are
-not permitted.)
-
-
Parameters:
-
name - the name of the enum constant to be returned.
Returns an array containing the constants of this enum type, in
-the order they are declared. This method may be used to iterate
-over the constants as follows:
-
-for (SPARQLResultFormat c : SPARQLResultFormat.values())
- System.out.println(c);
-
-
-
Returns:
-
an array containing the constants of this enum type, in the order they are declared
Returns the enum constant of this type with the specified name.
-The string must match exactly an identifier used to declare an
-enum constant in this type. (Extraneous whitespace characters are
-not permitted.)
-
-
Parameters:
-
name - the name of the enum constant to be returned.
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
-
-
-
Overview
-
The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.
-
-
-
Package
-
Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:
-
-
Interfaces (italic)
-
Classes
-
Enums
-
Exceptions
-
Errors
-
Annotation Types
-
-
-
-
Class/Interface
-
Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:
-
-
Class inheritance diagram
-
Direct Subclasses
-
All Known Subinterfaces
-
All Known Implementing Classes
-
Class/interface declaration
-
Class/interface description
-
-
-
Nested Class Summary
-
Field Summary
-
Constructor Summary
-
Method Summary
-
-
-
Field Detail
-
Constructor Detail
-
Method Detail
-
-
Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
-
-
-
Annotation Type
-
Each annotation type has its own separate page with the following sections:
-
-
Annotation Type declaration
-
Annotation Type description
-
Required Element Summary
-
Optional Element Summary
-
Element Detail
-
-
-
-
Enum
-
Each enum has its own separate page with the following sections:
-
-
Enum declaration
-
Enum description
-
Enum Constant Summary
-
Enum Constant Detail
-
-
-
-
Use
-
Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.
-
-
-
Tree (Class Hierarchy)
-
There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
-
-
When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
-
When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
-
-
-
-
Deprecated API
-
The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
-
-
-
Index
-
The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
-
-
-
Prev/Next
-
These links take you to the next or previous class, interface, package, or related page.
-
-
-
Frames/No Frames
-
These links show and hide the HTML frames. All pages are available with or without frames.
-
-
-
All Classes
-
The All Classes link shows all classes and interfaces except non-static nested types.
-
-
-
Serialized Form
-
Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.
This method parse the generic template and returns a list of Extractors
- that can later be used by the executor
- to get the data values from the records.