Warning:
This wiki has been archived and is now read-only.
Submitting Test Results
Contents
Overview
The Working Group is developing a Test Suite (TS). The test cases that comprise the Test Suite are described here
In this page we describe the process of creating the RDB2RDF R2RML/DM Implementation Reports.
This process consists of six phases.
The following figure depicts the whole process.
Phase 1. Download the Test Suite
Implementors should to download the zip file that contains the TS.
Alternatively, implementors should clone the mercurial repository that contains the TS.
The test cases are organized by database.
Each database has its own folder. The folder's name includes a code (e.g., D001) and description of the database (e.g., D000-1table0rows).
Within each folder we have:
- a
manifest.ttlfile that contains a description of the database, direct graph, r2rml mappings, and outputs. - a
create.sqlfile that contains the sql script for the creation of the database. - a
directGraph.ntthat contains the direct mapping for the given database. - one or more
r2rml.ttlfiles that include the r2rml mappings for the database. - one or more
mapped.nqfiles that contain the resultant graph for the corresponding r2rml.ttl file.
Phase 2. Run the engine over the TS
Once the implementors have the TS, it is time to run the engine over the test cases.
R2RML
R2RML implementors should scan all the directories included in the TS and do the following for each one of them:
- load the sql script (
create.sql) in the given DBMS. - load the r2rml mapping (
r2rml.ttl) file. - execute the r2rml mapping over the database loaded.
- generate the output RDF dataset and include the content in N-quads format in the
mapped-<yourtoolname>.nq, for example,mapped-d2r.nq
DM
DM implementors should do the following:
- load the sql script (
create.sql) in the given DBMS - generate the direct mapping for the database and include the output in TURTLE format in
directGraph-<your-tool-name>.ttl, for exampledirectGraph-morph.ttl
Phase 3. Download the Test Harness software
The Working Group is developing a Test Harness (TH) that allows comparison of test results from a given implementation against the official test results. The TH software is available here.
Phase 4. Run the TH software against your Test Results
After you have downloaded the TH software, you have to do the following
- Unzip it to the local file system.
- Modify the
ts.ttlfile, including the description of your tool, developer , the dbms used in the tests, and the location where the Test Suite with test results are stored, for example
<ts> a rdb2rdftest:TestSuite;
dcterms:title "Test Suite for Direct Mapping & R2RML" ;
dcterms:identifier "TS-01" ;
rdb2rdftest:workingDirectory "./local" .
<myProject>
a doap:Project ;
doap:name "morph" ;
doap:homepage <https://github.com/boricles/morph> ;
doap:programming-language "Java" ;
doap:developer <http://boris.villazon.terrazas.name/me> ;
rdb2rdftest:dbms r2rml:Oracle ;
rdb2rdftest:implementsDirectMapping false ;
rdb2rdftest:implementsR2RML true .
<http://boris.villazon.terrazas.name/me>
a foaf:Person ;
foaf:mbox <mailto:boris.villazon@terrazas.name> ;
foaf:name "Boris Villazon Terrazas" .
For the dbms you should use the URIs available here
- Run the rdb2rdf-th script with the manifest file as the argument, for example
./rdb2rdf-th ts.ttl
- After the execution the script generates the
earl-toolname-dm.ttl/earl-toolname-r2rml.ttlfile that contains the description of the test results. The content of the file looks like this
<http://mappingpedia.org/rdb2rdf/myTestHarness/morph>
a <http://www.w3.org/ns/earl#Software> .
[] a <http://www.w3.org/ns/earl#Assertion> ;
<http://purl.org/NET/rdb2rdf-test#dbms>
<http://www.w3.org/ns/r2rml#Oracle> ;
<http://www.w3.org/ns/earl#assertedBy>
<http://mappingpedia.org/rdb2rdf/myTestHarness/morph> ;
<http://www.w3.org/ns/earl#result>
[ a <http://www.w3.org/ns/earl#TestResult> ;
<http://purl.org/dc/elements/1.1/date>
"2012-04-03 14:45:59"^^<http://www.w3.org/2001/XMLSchema#date> ;
<http://www.w3.org/ns/earl#outcome>
<http://www.w3.org/ns/earl#pass>
] ;
<http://www.w3.org/ns/earl#subject>
<http://mappingpedia.org/rdb2rdf/myProject/morph> ;
<http://www.w3.org/ns/earl#test>
<http://www.w3.org/2001/sw/rdb2rdf/test-cases/#DirectGraphTC0005> .
Phase 5. Upload the Test Report
Within this step, implementors should provide a link for the Test Report, e.g., earl-toolname-dm.ttl/earl-toolname-r2rml.ttl file, to the rdb2rdf mailing list.
Phase 6. Generate the Implementation Report
The working group will collect the test reports of all the available implementors of R2RML/DM and generate an implementation report similar to this.
Notes
We are creating a matrix that shows the coverage of the R2RML TC and DM TC.
Annex
BASH script to compare tests
What this script does:
- for each directory in the test suite:
- load the SQL script into the database (tested with PostgreSQL and MySQL)
- query the manifest.ttl graph to extract info regarding each test-case
- run each test-case using XSPARQL
- compare the result of the XSPARQL query to the expected output using JENA's 'rdfcompare'
#!/bin/bash
# XSPARQL config
if [ -z $XSPARQLHOME ]; then
XSPARQLHOME=`pwd`
fi
export JENAROOT=/Users/nl/work/deri/sw/Jena-2.6.4/
RDFCOMP=$JENAROOT/bin/rdfcompare
CLASSPATH="$CLASSPATH:$XSPARQLHOME/cli/target/cli-0.3-SNAPSHOT-bin/libs/*"
OPTS=
EXAMPLESDIR=rdb2rdf/rdb2rdf-tests/
PSQL="psql91"
MYSQL="mysql5"
function usage() {
echo "USAGE: $0 [-mysql|-psql]";
exit 1;
}
function read_config () {
# read configuration from properties file
MKTEMP="mktemp -t tmp.XXXXXXXXXX"
TEMPFILE=$($MKTEMP)
cat $XSPARQLHOME/$DBCONFIG |\
sed -e 's/"/"/'g|sed -e 's/=\(.*\)/="\1"/g'>$TEMPFILE
source $TEMPFILE
rm -f $TEMPFILE
dbName=rdb2rdf_tests
}
# ============== command line processing
GREP="."
XSPARQLOPTS=""
# check if there is an argument from the command line
if [ $# -gt 0 ]; then
if [ $1 == '-mysql' ]; then
DBCONFIG=mysql.properties
read_config
DB="$MYSQL -u $dbUser"
if [ "${dbPasswd-x}" != "x" ] ; then
DB="$DB -p$dbPasswd"
fi
DEFAULTDB=mysql
XSPARQLOPTS="-mysql"
fi
if [ $1 == '-psql' ]; then
DBCONFIG=psql.properties
read_config
DB="$PSQL -U $dbUser"
DEFAULTDB=postgres
XSPARQLOPTS="-psql"
fi
shift 1
if [ -n $1 ]; then
GREP="$1"
shift 1
fi
else
usage
fi
XSPARQL="java $OPTS -cp $CLASSPATH org.deri.xsparql.Main "
XSPARQLRDB="$XSPARQL -dbConfig $XSPARQLHOME/$DBCONFIG $XSPARQLOPTS"
MKTEMP="mktemp -t tmp.XXXXXXXXXX"
TMPFILE=$($MKTEMP)
failed=0
ntests=0
function compare_result() {
# function arguments
RES=$1
MAP=$2/$3
# compare the datasets
$RDFCOMP $TMPFILE $MAP N3 N3 &> /dev/null
COMP=$?
# no result expected
if [ -z $3 ] ; then
if [ $COMP -ne 0 ] &> /dev/null
then
echo -e " PASS (negative test)"
else
echo -e " FAIL (negative test)"
let failed++
fi
else
if [ $RES -eq 0 ] && [ $COMP -eq 0 ] &> /dev/null
then
echo -e " PASS"
else
if [ $COMP -eq 255 ];
then
echo -e " NQUAD"
else
echo -e " FAIL"
let failed++
fi
echo -e ">>>> $MAP"
cat $MAP
echo "<<<<"
echo ">>>> XSPARQL"
cat $TMPFILE
echo -e "<<<<\n\n\n"
fi
fi
}
function test_r2rml() {
$XSPARQL <<EOF > $TMPFILE
prefix rdb2rdftest: <http://purl.org/NET/rdb2rdf-test#>
prefix dcterms: <http://purl.org/dc/elements/1.1/>
let \$res := <res>{
for * from <file:$1>
where { \$a a rdb2rdftest:R2RML;
dcterms:identifier \$id;
rdb2rdftest:mappingDocument \$map .
optional { \$a rdb2rdftest:output \$output }
}
order by \$map
return <row><output>{fn:concat("""", \$output, """")}</output><ident>{fn:concat("""", \$id, """")}</ident><map>{fn:concat("""", \$map, """")}</map></row>
}</res>
return
fn:concat("local OUTPUTS=(",fn:string-join(\$res//output, " "), ")
local IDENTS=(", fn:string-join(\$res//ident, " "), ")
local MAPS=(", fn:string-join(\$res//map, " "),")
")
EOF
source $TMPFILE
SIZE=${#MAPS[@]}
for (( i=0; i<$SIZE; i++ )); do
local MAP=${MAPS[$i]};
local IDENT=${IDENTS[$i]};
local OUTPUT=${OUTPUTS[$i]};
echo -ne " $IDENT: `dirname $1`/$MAP .... "
let ntests++
$XSPARQLRDB -dbName $dbName -r2rml `dirname $1`/$MAP > $TMPFILE 2>/dev/null
RES=$?
sed 's/>/>/g' < $TMPFILE >$TMPFILE.2
sed 's/</</g' < $TMPFILE.2 >$TMPFILE
rm $TMPFILE.2
compare_result $RES `dirname $1` $OUTPUT
done
}
function test_direct_mapping() {
# check direct mapping
$XSPARQL <<EOF > $TMPFILE
prefix rdb2rdftest: <http://purl.org/NET/rdb2rdf-test#>
prefix dcterms: <http://purl.org/dc/elements/1.1/>
for * from <file:$1>
where {\$a a rdb2rdftest:DirectMapping; rdb2rdftest:output \$output; dcterms:identifier \$id}
return fn:concat("local OUTPUT=""",fn:data(\$output), """
local IDENT=""", \$id,"""
")
EOF
source $TMPFILE
if [ -z "$IDENT" ]; then
return 0;
fi
echo -en " $IDENT ... "
let ntests++
$XSPARQLRDB -dbName $dbName -dm "" > $TMPFILE 2>/dev/null
RES=$?
sed 's/>/>/g' < $TMPFILE >$TMPFILE.2
sed 's/</</g' < $TMPFILE.2 >$TMPFILE
rm $TMPFILE.2
compare_result $RES `dirname $1` $OUTPUT
}
function test_file () {
# create the database
$DB $DEFAULTDB <<EOF &> /dev/null
DROP DATABASE IF EXISTS $dbName ;
CREATE DATABASE $dbName;
EOF
# read SQL script file
SQL=$($XSPARQL <<EOF
prefix rdb2rdftest: <http://purl.org/NET/rdb2rdf-test#>
for * from <file:$1>
where {\$a rdb2rdftest:sqlScriptFile \$c}
return fn:data(\$c)
EOF
)
if [ -z "$SQL" ]; then
return 0;
fi
# create database contents from SQL script file
$DB $dbName < `dirname $1`/$SQL &> /dev/null
# echo " => Direct Mapping"
# test_direct_mapping $1
echo " => R2RML"
test_r2rml $1
# delete the database
$DB $DEFAULTDB <<EOF &> /dev/null
DROP DATABASE $dbName;
EOF
}
function test_files() {
FILES=$(find $EXAMPLESDIR -iname manifest.ttl | grep "$GREP" );
for FILE in $FILES
do
echo -e "\n===> Manifest: $FILE"
test_file $FILE
done
}
# test manifest files
test_files
# cleanup
rm -f $TMPFILE
echo ========== XSPARQL tests completed ==========
echo Tested $ntests queries
echo $failed failed
echo =============================================
exit $failed