2016-03-09 4 views
1

Je suis en train de jouer avec R2RML et je me demandais si je pouvais créer une propriété en fonction du contenu d'une cellule de table RDB.Création conditionnelle de propriété dans R2RML

Le langage de mappage D2RQ a d2rq:condition qui peut gérer cela.

par exemple:

si la valeur dans la colonne/cellule de tableau 'nom' est 'abc' créer propriété 'abc'

rr:predicateObjectMap [ 
    rr:predicate ex:abc 
    rr:objectMap [ 
     rr:column "name"; 
     rr:datatype xsd:string; 
     # equivalent for d2rq:condition "name='abc'" 
    ]; 
] 

si la valeur en 'nom' de la colonne/table cellule est 'xyz' créer la propriété 'xyz'

Je n'ai trouvé aucune suggestion dans la recommandation R2RML du W3C.

Des idées? :-)


Mise à jour:

J'ai eu l'idée d'utiliser rr:sqlQuery par exemple

rr:SQLQuery """ 
    select (case TABLENAME.COLUMNNAME 
     when 'this' then 'propertyOne' 
     when 'that' then 'propertyTwo' 
     end) as VARIABLE_PREDICATE 
    from TABLENAME """; 

et l'appliquer à un rr:predicate ou rr:predicateMap avec

rr:predicateObjectMap [ 
     rr:predicateMap [ rr:template "ex:{VARIABLE_PREDICATE}" ]; 
     rr:objectMap [ rr:column "COLUMNNAME"; ]; 
]; 

Mais cela ne fonctionne pas. Je suppose que predicateMaps peut être rr:constant s seulement et non rr:template s :(Au moins la recommandation du W3C indique que les constantes dans les predicateMap

Toujours à la recherche d'une solution ...:../

PS Je suis déçu que un langage propriétaire comme d2rq semble être plus puissant (à ce stade)

+0

Ce document mentionne 'rr: joinCondition' comme similaire à' d2rq: condition': https://github.com/RMLio/D2RQ_to_R2RML – CaptSolo

+0

Merci pour le lien! Mais malheureusement, ce n'est pas correct. Je vérifiais la page de recommandation du W3C pour R2RML et aussi cette page https://www.w3.org/ns/r2rml#joinCondition .... Cela fonctionne juste pour les jointures :( – Kody

+0

Dommage que cela n'a pas fonctionné. – CaptSolo

Répondre

1

R2RML n'a pas de propriétés conditionnelles (comme dans D2RQ) Le design a été fait exprès pour ne pas compliquer le langage. le mappage "complexe" nécessite SQL

Une solution est la suivante:

@prefix rr: <http://www.w3.org/ns/r2rml#>. 

<#Mapping> a rr:TriplesMap; 
    rr:logicalTable [ rr:SQLQuery """ 
     select id, COLUMNNAME, (case TABLENAME.COLUMNNAME 
     when 'this' then 'http://ex.com/propertyOne' 
     when 'that' then 'http://ex.com/propertyTwo' 
     end) as VARIABLE_PREDICATE 
     from TABLENAME """; ]; 
    rr:subjectMap [ 
     rr:template "http://ex.com/foo/{id}"; 
    ]; 

    rr:predicateObjectMap [ 
     rr:predicateMap [ rr:column "VARIABLE_PREDICATE" ]; 
     rr:objectMap [ rr:column "COLUMNNAME" ]; 
    ]. 
+0

J'ai essayé avec 'r2rml parser', mais il a totalement ignoré la partie sqlQuery et n'a pas créé de triplé concernant la propriété de la variable quel processeur/mapper r2rml utilisez-vous? :) – Kody

+0

J'utilise Ultrawrap de Capsenta . Disclaimer, je travaille pour Capsenta. –

+0

C'est cool :) ...Ne vous méprenez pas ... mais êtes-vous sûr de pouvoir appliquer un 'rr: column' à un' rr: predicate' ou 'rr: predicateMap'? Dans tous les fichiers r2rml que j'ai vus, il y a juste 'rr: constants' qui sont appliqués aux prédicats/predicateMaps. – Kody

0

Nous faisons régulièrement que, dans la cartographie des Vocabs Getty, pour les accessoires qui dépendent des valeurs de clé (drapeaux). Par exemple,

<#ContribTermRelPreferred> 
    a rr:TriplesMap; 
    rr:logicalTable [ rr:sqlQuery """ 
    SELECT ... 
     UDF_LOD_LOOKUP_PROPERTY('contrib_rels_term','preferred',CRT.PREFERRED) CONTRIBPREF 
    """ ]; 
rr:predicateObjectMap [ 
    rr:predicateMap [ rr:column "CONTRIBPREF" ]; 
    rr:objectMap [ rr:template "http://vocab.getty.edu/aat/contrib/{CONTRIB_ID}" ]; 
]. 
+0

Nous utilisons l'implémentation Perl de r2rml –