aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMunyoki Kilyungi2023-10-14 11:49:44 +0300
committerBonfaceKilz2023-10-27 13:45:32 +0300
commita5e447a6faf4ddd4788fabcdb8f1d5c676e61439 (patch)
treea455af47ba2995f47599d76d41380473f8d3af9c
parent50349f7e067bd894d4aa4865ded5589ee1fcd9e9 (diff)
downloadgenenetwork3-a5e447a6faf4ddd4788fabcdb8f1d5c676e61439.tar.gz
Implement "GET /metadata/datasets/search/:term".
* gn3/api/metadata.py (search_datasets): New search endpoint with pagination. Signed-off-by: Munyoki Kilyungi <me@bonfacemunyoki.com>
-rw-r--r--gn3/api/metadata.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/gn3/api/metadata.py b/gn3/api/metadata.py
index 877ff7c..fd3166c 100644
--- a/gn3/api/metadata.py
+++ b/gn3/api/metadata.py
@@ -6,6 +6,7 @@ from http.client import RemoteDisconnected
from urllib.error import URLError
from flask import Blueprint
from flask import jsonify
+from flask import request
from flask import current_app
from pyld import jsonld
@@ -120,6 +121,81 @@ CONSTRUCT {
# 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"""
+ try:
+ args = request.args
+ page = args.get("page", 0)
+ page_size = args.get("limit", 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 ?label ;
+ dct:title ?title ;
+ ex:belongsToInbredSet ?inbredSetName ;
+ xkos:classifiedUnder ?datasetType
+ ]
+} WHERE {
+{
+ SELECT ?dataset ?label ?inbredSetName ?datasetType ?title WHERE {
+ ?dataset rdf:type dcat:Dataset ;
+ rdfs:label ?label ;
+ xkos:classifiedUnder ?inbredSet .
+ ?inbredSet ^skos:member gnc:Set ;
+ rdfs:label ?inbredSetName .
+ ?label bif:contains "'$term'" .
+ OPTIONAL {
+ ?dataset dct:title ?title .
+ } .
+ OPTIONAL {
+ ?classification ^xkos:classifiedUnder ?dataset ;
+ ^skos:member gnc:DatasetType ;
+ ?typePredicate ?typeName ;
+ skos:prefLabel ?datasetType .
+ }
+ } ORDER BY ?dataset LIMIT $limit OFFSET $offset
+}
+
+{
+ SELECT (COUNT(*)/$limit+1 AS ?totalCount) WHERE {
+ ?dataset rdf:type dcat:Dataset ;
+ rdfs:label ?label .
+ ?label bif:contains "'$term'" .
+ }
+}
+
+}
+""").substitute(prefix=RDF_PREFIXES, term=term, limit=page_size, offset=page))
+ return jsonld.frame(
+ json.loads(
+ sparql.queryAndConvert().serialize(format="json-ld")),
+ {
+ "@context": PREFIXES | {
+ "data": "@graph",
+ "type": "@type",
+ "id": "@id",
+ "inbredSet": "ex:belongsToInbredSet",
+ "classifiedUnder": "xkos:classifiedUnder",
+ "dataset": "rdfs:label",
+ "title": "dct:title",
+ "currentPage": "ex:currentPage",
+ "result": "ex:result",
+ "results": "ex:items",
+ "resultItem": "ex:resultType",
+ "pages": "ex:totalCount"
+ },
+ "type": "resultItem",
+ }
+ )
# The virtuoso server is misconfigured or it isn't running at all
except (RemoteDisconnected, URLError):
return jsonify({})