All Downloads are FREE. Search and download functionalities are using the official Maven repository.

function.datashape.text.shacl2sparql.rq Maven / Gradle / Ivy

#
# SHACL to SPARQL path pretty printer
#
prefix sh:  

# 
# path = URI | bnode
# bnode : [sh:zeroOrOnePath exp ] | (exp1 .. expn)
#
function sh:path(path) {
    if (isURI(path)) {
        return (xt:turtle(path))
    }
    else {
        let (select * where { ?path ?oper ?val filter (?oper not in (rdf:first)) } ) {
            return (if (oper = rdf:rest, sh:sequencePath(path), funcall(oper, val)))
        }
    }
}

function sh:paren(path) {
    if (isURI(path), sh:path(path), concat("(", sh:path(path), ")"))
}

function sh:oneOrMorePath(path) {
     concat(sh:paren(path), "+")
}

function sh:zeroOrOnePath(path) {
     concat(sh:paren(path), "?")
}    

function sh:zeroOrMorePath(path) {
     concat(sh:paren(path), "*")
}    

function sh:inversePath(path) {
     concat("^", sh:paren(path))
}

# path = list(e1 .. en)
function sh:alternativePath(path) {
    sh:reduce(path, "|")
}

# path = (e1 .. en)
function sh:sequencePath(path) {
    sh:reduce(path, "/")
}

function sh:reduce(path, sep) {
    letdyn (astr = sep) {
         reduce(lambda(x, y) { concat(x, astr, y) }, 
            maplist(sh:path, sh:list(path)))
    }
}

function sh:list(path) {
    let (select path (aggregate(?exp) as ?list) 
         where { ?path rdf:rest*/rdf:first ?exp } ) {
         return (list)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy