diff --git a/YKWIM/generateRDF.py b/YKWIM/generateRDF.py new file mode 100644 index 0000000000000000000000000000000000000000..5997ec184789bf429f4b7cc746115f0666853f6d --- /dev/null +++ b/YKWIM/generateRDF.py @@ -0,0 +1,21 @@ +##### to review completly +import sys +import subprocess +import generateJSON as g +import generateSparqlGenerateQuery as q +import uuid +import os + +def generateRDF (file, dataset) : + """generate RDF data from SPARQL Generate query""" + + query_file=q.generateSparqlGenerateQuery(g.generateJSON(file),dataset) + base_name = str(uuid.uuid4()) + result_file = base_name + ".ttl" + subprocess.run('java -jar sparql-generate*.jar --query-file '+ query_file+' --output '+result_file, shell=True) + + return result_file + +if __name__ == "__main__": + #dataset = "https://download.data.grandlyon.com/wfs/grandlyon?SERVICE=WFS&VERSION=2.0.0&request=GetFeature&typename=adr_voie_lieu.adrcomgl&outputFormat=application/json;%20subtype=geojson&SRSNAME=EPSG:4171" + print (generateRDF(sys.argv[1], sys.argv[2])) \ No newline at end of file diff --git a/YKWIM/generateSparqlGenerateQuery.py b/YKWIM/generateSparqlGenerateQuery.py new file mode 100644 index 0000000000000000000000000000000000000000..08276e87b0ff222d9058cf4946c245aa9ff8e720 --- /dev/null +++ b/YKWIM/generateSparqlGenerateQuery.py @@ -0,0 +1,64 @@ +##### to review completly +import sys +import subprocess +import generateJSON as g +import uuid +import os + +def generateSparqlGenerateQuery (d, dataset) : + """generate SPARQL Generate query""" + + s = """PREFIX iter: <http://w3id.org/sparql-generate/iter/> + PREFIX fun: <http://w3id.org/sparql-generate/fn/> + PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> + PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> + GENERATE {\n""" + + #iterate over classes + for list in d["classes"]: + if (list["IRI"]!=""): + s+=("?{} a <{}>".format(list["name"],list["IRI"]))+ ";\n" + else: s+=("?{} a <http://data.grandlyon.com/ontology/{}".format(list["name"],list["name"]))+ ">;\n" + + #iterate over attributes + l=len(list["attributes"]) + for i , attr in enumerate(list["attributes"]): + if (attr["IRI"]!=""): + s+=("\t<{}> ?{}".format(attr["IRI"],attr["name"])) + else: s+=("\t<http://data.grandlyon.com/ontology/{}> ?{}".format(attr["name"],attr["name"])) + s+=";\n" if (i<l-1) else ".\n" + + #iterate over associations + for list in d["associations"]: + if (list["IRI"]!=""): + s += ("?{} <{}> ?{}".format(list["source"],list["IRI"],list["destination"])) + ".\n" + else : s += ("?{} <http://data.grandlyon.com/ontology/{}> ?{}".format(list["source"],list["name"],list["destination"])) + ".\n" + + #iterate over enumerations + for list in d["enumerations"]: + if (list["IRI"]!=""): + s+=("?{} a <{}>".format(list["name"],list["IRI"]))+ ".\n" + else: s+=("?{} a <http://data.grandlyon.com/vocabulary/{}".format(list["name"],list["name"]))+ ">.\n" + + s+=("}} \n SOURCE <{}> AS ?source \nITERATOR iter:GeoJSON(?source) AS ?geometricCoordinates ?properties \n WHERE {{\n".format(dataset)) + + #bindings + for list in d["classes"]: + for attr in list["attributes"]: + s+=('BIND (fun:JSONPath(?properties,"$.{}") AS ?{})\n'.format(attr["source"], attr["name"])) + if (attr["id"]=="oui") : + s+=('BIND(IRI(CONCAT("http://data.grandlyon.com/id/{}/",fun:JSONPath(?properties,"$.{}"))) AS ?{})\n'.format(list["name"],attr["source"],list["name"])) + + for enum in d["enumerations"]: + s+=('BIND(IRI("http://data.grandlyon.com/vocabulary/Cadres_administratifs") AS ?{})\n'.format(enum["name"])) + + s+= "}\n" + base_name = "query_"+str(uuid.uuid4()) + query_path = base_name + ".rq" + with open(query_path, 'w') as fp: + fp.write(s) + return query_path + +if __name__ == "__main__": + #dataset = "https://download.data.grandlyon.com/wfs/grandlyon?SERVICE=WFS&VERSION=2.0.0&request=GetFeature&typename=adr_voie_lieu.adrcomgl&outputFormat=application/json;%20subtype=geojson&SRSNAME=EPSG:4171" + print (generateSparqlGenerateQuery(g.generateJSON(sys.argv[1]), sys.argv[2])) \ No newline at end of file