aboutsummaryrefslogtreecommitdiff
path: root/gn3/api
diff options
context:
space:
mode:
authorMunyoki Kilyungi2023-10-24 15:30:44 +0300
committerBonfaceKilz2023-10-27 13:45:32 +0300
commit4ca6bf9c8d4c3428a1f5b670531150291982cd66 (patch)
tree25fc21b17ee11db786cae6576328aa786a6b797e /gn3/api
parent4138e565f52cd3661c1d370d16b543ba137ac826 (diff)
downloadgenenetwork3-4ca6bf9c8d4c3428a1f5b670531150291982cd66.tar.gz
Implement "GET /metadata/datasets/:group/list".
* gn3/api/metadata.py (list_datasets_by_group): New end-point. Signed-off-by: Munyoki Kilyungi <me@bonfacemunyoki.com>
Diffstat (limited to 'gn3/api')
-rw-r--r--gn3/api/metadata.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/gn3/api/metadata.py b/gn3/api/metadata.py
index 542a0a3..1fa4a13 100644
--- a/gn3/api/metadata.py
+++ b/gn3/api/metadata.py
@@ -131,6 +131,88 @@ CONSTRUCT {
return jsonify({})
+@metadata.route("/datasets/<group>/list", methods=["GET"])
+def list_datasets_by_group(group):
+ """List datasets that belong to a given group"""
+ try:
+ args = request.args
+ page = args.get("page", 0)
+ page_size = args.get("per-page", 10)
+ sparql = SPARQLWrapper(current_app.config.get("SPARQL_ENDPOINT"))
+ sparql.setQuery(Template("""
+$prefix
+
+CONSTRUCT {
+ ex:result rdf:type ex:resultType ;
+ ex:totalCount ?totalCount ;
+ ex:currentPage $offset ;
+ ex:items [
+ rdfs:label ?datasetName ;
+ dct:identifier ?accessionId ;
+ dct:created ?createTime ;
+ dct:title ?title ;
+ ] .
+} WHERE {
+{
+ SELECT ?datasetName ?accessionId ?createTime ?title WHERE {
+ ?dataset rdf:type dcat:Dataset ;
+ rdfs:label ?datasetName .
+ ?inbredSet ^skos:member gnc:Set ;
+ ^xkos:classifiedUnder ?dataset ;
+ rdfs:label ?inbredSetName ;
+ skos:prefLabel ?group .
+ ?group bif:contains "$group" .
+ OPTIONAL { ?dataset dct:identifier ?accesionId . } .
+ OPTIONAL { ?dataset dct:created ?createTime . } .
+ OPTIONAL { ?dataset dct:title ?title . } .
+ } ORDER BY ?createTime LIMIT $limit OFFSET $offset
+}
+{
+ SELECT (COUNT(DISTINCT ?dataset)/$limit+1 AS ?totalCount) WHERE {
+ ?dataset rdf:type dcat:Dataset ;
+ rdfs:label ?datasetName .
+ ?inbredSet ^skos:member gnc:Set ;
+ ^xkos:classifiedUnder ?dataset ;
+ rdfs:label ?inbredSetName ;
+ skos:prefLabel ?group .
+ ?group bif:contains "$group" .
+ }
+}
+}
+""").substitute(prefix=RDF_PREFIXES, group=group, limit=page_size, offset=page))
+ results = sparql.queryAndConvert()
+ results = json.loads(
+ results.serialize(format="json-ld")
+ )
+ frame = {
+ "@context": {
+ "classifiedUnder": "xkos:classifiedUnder",
+ "created": "dct:created",
+ "data": "@graph",
+ "dct": "http://purl.org/dc/terms/",
+ "ex": "http://example.org/stuff/1.0/",
+ "id": "@id",
+ "title": "dct:title",
+ "name": "rdfs:label",
+ "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+ "type": "@type",
+ "xkos": "http://rdf-vocabulary.ddialliance.org/xkos#",
+ "pages": "ex:totalCount",
+ "result": "ex:result",
+ "results": "ex:items",
+ "resultItem": "ex:resultType",
+ "currentPage": "ex:currentPage",
+ },
+"type": "resultItem",
+ }
+ return jsonld.compact(
+ jsonld.frame(results, frame),
+ frame)
+ # The virtuoso server is misconfigured or it isn't running at all
+ except (RemoteDisconnected, URLError):
+ return jsonify({})
+
+
@metadata.route("/datasets/search/<term>", methods=["GET"])
def search_datasets(term):
"""Search datasets"""