Skip to content

Commit

Permalink
Query service
Browse files Browse the repository at this point in the history
  • Loading branch information
loleg committed Apr 30, 2023
1 parent cf2a9bf commit 453ac98
Show file tree
Hide file tree
Showing 4 changed files with 154 additions and 19 deletions.
50 changes: 50 additions & 0 deletions backend/fedlexrdf.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from SPARQLWrapper import SPARQLWrapper, JSON

sparql = SPARQLWrapper(
'https://fedlex.data.admin.ch/sparqlendpoint'
)
sparql.setReturnFormat(JSON)

SPARQL_TEMPLATE = '''
PREFIX jolux: <http://data.legilux.public.lu/resource/ontology/jolux#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX DEUTSCH: <http://publications.europa.eu/resource/authority/language/DEU>
select ?dateApplicability (str(?rsNode) as ?rs) ?droit ?title {
{
select (str(?dateApplicabilityNode) as ?dateApplicability) ?lang ?legalTopicRegex ?consolidationAbstract {
values (?startDate ?endDate ?lang ?legalTopicRegex) {
('%s' '%s' DEUTSCH: '^(%s)')
}
?consolidation a jolux:Consolidation ;
jolux:dateApplicability ?dateApplicabilityNode ;
jolux:isMemberOf ?consolidationAbstract .
filter(xsd:date(?dateApplicabilityNode) >= xsd:date(?startDate) && xsd:date(?dateApplicabilityNode) <= xsd:date(?endDate))
}
}
?consolidationAbstract jolux:classifiedByTaxonomyEntry/skos:notation ?rsNode .
optional {
?consolidationAbstract jolux:isRealizedBy ?expression .
?expression jolux:language ?lang ;
jolux:title ?title .
}
#filter(datatype(?rsNode) = <https://fedlex.data.admin.ch/vocabulary/notation-type/id-systematique>)
bind(if(strstarts(?rs, '0.'), 'International', 'National') as ?droit)
FILTER(REGEX (?rsNode, ?legalTopicRegex))
}
order by ?dateApplicability ?rsNode
'''

def fedlexQuery(q, d_from, d_until):
try:
query = SPARQL_TEMPLATE % (d_from, d_until, q)
sparql.setQuery(query)
ret = sparql.query()
return ret.convert()
except Exception as e:
print(e)
return None
69 changes: 64 additions & 5 deletions backend/poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions backend/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ python = ">=3.7,<4"
falcon = "^3.1.1"
frictionless = "^4"
orjson = "^3.8.11"
sparqlwrapper = "^2.0.0"

[build-system]
requires = ["poetry-core"]
Expand Down
53 changes: 39 additions & 14 deletions backend/server.py
Original file line number Diff line number Diff line change
@@ -1,48 +1,73 @@
import falcon
import json

from os import environ
from frictionless import Package
from wsgiref.simple_server import make_server

from fedlexrdf import fedlexQuery

MAX_RESULTS = 1000


package = Package('datapackage.json')

api = falcon.App()


def flattenMe(doc):
transformed = []
vars = doc['head']['vars']
for r in doc['results']['bindings']:
row = {}
for v in vars:
row[v] = r[v]['value']
transformed.append(row)
if len(transformed) > MAX_RESULTS:
break
return transformed


class DataResource:

def __init__(self, data):
self.resource = data

def on_get(self, req, resp):
if self.resource.profile == "sparql-json-resource":
transformed = []
with open(self.resource.path) as f:
doc = json.loads(f.read())
vars = doc['head']['vars']
for r in doc['results']['bindings']:
row = {}
for v in vars:
row[v] = r[v]['value']
transformed.append(row)
if len(transformed) > MAX_RESULTS:
break

resp.text = json.dumps(transformed, ensure_ascii=False)
resp.status = falcon.HTTP_200

jsonDoc = flattenMe(doc)

resp.text = json.dumps(jsonDoc, ensure_ascii=False)
resp.status = falcon.HTTP_200


# Create end-points for each Resource in the Data Package
for resource in package.resources:
api.add_route("/%s" % resource.name, DataResource(resource))



class DataQuery:

def on_get(self, req, resp):
q = req.get_param('q', required=False, default='')
d_from = req.get_param('from', required=False, default='2023-09-01')
d_until = req.get_param('until', required=False, default='9999-12-31')

rawData = fedlexQuery(q, d_from, d_until)
jsonDoc = flattenMe(rawData)

resp.text = json.dumps(jsonDoc, ensure_ascii=False)
resp.status = falcon.HTTP_200


# Create end-point for our SPARQL query
#api.add_route("/query", DataQuery())
api.add_route("/query", DataQuery())


# Standalone app
if __name__ == '__main__':
port = int(environ.get('PORT', 8000))
with make_server('', port, api) as httpd:
Expand Down

0 comments on commit 453ac98

Please sign in to comment.