Hello folks,
I'm currently evaluating Stardog 5.0.4 Community as a possible substitute for Fuseki.
My use case is the publication of RDF/XML data that I created from XML using XSLT. Source code is here.
Problem: the shorthand technique offered by RDF/XML to implicitly declare the rdfs:type of a resource is misinterpreted by Stardog upon upload as rdf:type (which doesn't exist).
Here is a sample document, in extenso:
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:b="https://data.maudry.com/voc/boamp#"
xmlns:dct="http://purl.org/dc/terms/"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:attributions="https://boamp.maudry.com/attributions/"
xmlns:appeloffres="https://boamp.maudry.com/appeloffres/"
xmlns:annonces="https://boamp.maudry.com/annonces/"
xmlns:acheteurs="https://boamp.maudry.com/acheteurs/"
xmlns:titulaires="https://boamp.maudry.com/titulaires/"
xmlns:descripteurs="https://boamp.maudry.com/descripteurs/"
xmlns:lots="https://boamp.maudry.com/lots/"
xmlns:cpv="https://boamp.maudry.com/cpv/">
<b:Annonce rdf:about="https://boamp.maudry.com/annonces/16-652">
<rdfs:type rdf:resource="https://data.maudry.com/voc/boamp#Annonce"/>
<b:idweb>16-652</b:idweb>
<b:nomHtml>16-652.html</b:nomHtml>
<b:datePublication rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-01-05</b:datePublication>
<b:dateFinDiffusion rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-01-25</b:dateFinDiffusion>
<b:descripteur rdf:resource="https://boamp.maudry.com/descripteurs/274"/>
<b:departementPublication>42</b:departementPublication>
<b:resumeObjet>prestation d'interim médical en anesthesie-réanimation, CHU, à Saint-Etienne</b:resumeObjet>
<b:appelOffres>
<b:AppelOffres rdf:about="https://boamp.maudry.com/appeloffres/16-652">
<b:acheteur>
<rdf:Description rdf:about="https://boamp.maudry.com/acheteurs/CHU-St-Etienne">
<rdfs:type rdf:resource="https://data.maudry.com/voc/boamp#Autre"/>
<rdfs:label>CHU St Etienne</rdfs:label>
<b:codePostal>42055</b:codePostal>
<b:ville>St etienne</b:ville>
<b:profilAcheteur rdf:resource="http://www.achats-hopitaux.com"/>
</rdf:Description>
</b:acheteur>
<rdfs:type rdf:resource="https://data.maudry.com/voc/boamp#Autre"/>
<b:typeMarche>Service</b:typeMarche>
<b:objetComplet>DAMR 2016/01 PRESTATION D'INTERIM MEDICAL EN ANESTHESIE-REANIMATION</b:objetComplet>
<b:cpvPrincipal rdf:resource="https://boamp.maudry.com/cpv/79625000"/>
<b:codePostal>42055</b:codePostal>
<b:ville>Saint etienne cédex 2</b:ville>
<b:typeProcedure>Procedure adapte</b:typeProcedure>
</b:AppelOffres>
</b:appelOffres>
</b:Annonce>
</rdf:RDF>
Three resources have their (or one of their) rdfs:type declared:
- a
b:Annonce
with URI<https://boamp.maudry.com/annonces/16-652>
(the class is declared two times, by the way) - a
b:AppelOffres
(with also classb:Autre
) with URI<https://boamp.maudry.com/appeloffres/16-652>
- a
b:Autre
with URI<https://boamp.maudry.com/acheteurs/CHU-St-Etienne>
I upload this document using the Stardog command line tool, with this script.
I test the uploaded data with these queries. The repository only contains the above document.
Query to list the distinct classes (typed in Stardog query editor, copied from the actual HTTP payload to also have the prefixes)
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix boamp: <https://data.maudry.com/voc/boamp#>
select distinct ?class where {
?resource a ?class .
} limit 50 offset 0
Expected :
- boamp:Annonce
- boamp:AppelOffres
- boamp:Autre
Results:
- boamp:AppelOffres
Same query, with specific namespace and property for class binding
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix boamp: <https://data.maudry.com/voc/boamp#>
select distinct ?class where {
?resource rdfs:type ?class .
} limit 50 offset 0
Expected :
- boamp:Annonce
- boamp:AppelOffres
- boamp:Autre
Results:
- boamp:Annonce
- boamp:Autre
With rdf:type (a property that doesn't exist, normally)
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix boamp: <https://data.maudry.com/voc/boamp#>
select distinct ?class where {
?resource rdf:type ?class .
} limit 50 offset 0
Expected :
- no result
Results:
- boamp:AppelOffres
I can't really draw conclusion on where the problem resides, but there is definitely something fishy going on...
Edit: the SPARQL a
keyword seems to yield the same result as rdf:type
.
Edit 2: the explicit class declaration (rdfs:type) for b:Annonce seems to have overriden the implicit one (element name)
Edit 3: strict parsing is on, reasoning is off