about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMunyoki Kilyungi2023-10-24 10:24:49 +0300
committerBonfaceKilz2023-10-27 13:45:32 +0300
commitddc020ada152997abefe65b6ac162ebc6b971e89 (patch)
treec73c216802ad85ff8c472fa9a5caac7cf2f2bea2
parentf85a5403e5b32d997da51ad8b973791589397644 (diff)
downloadgenenetwork3-ddc020ada152997abefe65b6ac162ebc6b971e89.tar.gz
Implement "GET /genewikis/gn/:symbol".
* gn3/api/metadata.py (get_genewiki_entries): Rename this to ...
(get_gn_genewiki_entries): ... this.  Create an end-point for querying
GN GeneRIF entries.

Signed-off-by: Munyoki Kilyungi <me@bonfacemunyoki.com>
-rw-r--r--gn3/api/metadata.py147
1 files changed, 83 insertions, 64 deletions
diff --git a/gn3/api/metadata.py b/gn3/api/metadata.py
index f023e17..435199b 100644
--- a/gn3/api/metadata.py
+++ b/gn3/api/metadata.py
@@ -445,72 +445,91 @@ CONSTRUCT {
         return jsonify({})
 
 
-@metadata.route("/genewiki/<symbol>", methods=["GET"])
-def get_genewiki_entries(symbol):
+@metadata.route("/genewikis/gn/<symbol>", methods=["GET"])
+def get_gn_genewiki_entries(symbol):
     """Fetch the GN and NCBI GeneRIF entries"""
     try:
-        gn_entries = sparql_query(
-            sparql_conn=SPARQLWrapper(current_app.config.get("SPARQL_ENDPOINT")),
-            query=Template("""
-$rdf_prefixes
+        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
 
-SELECT ?author ?geneCategory (STR(?gnEntry) AS ?entry)
-       (STR(?createdOn) AS ?created)
-       (GROUP_CONCAT(DISTINCT ?pmid; SEPARATOR=',') AS ?PubMedId)
-       ?weburl
-WHERE {
-  ?generif gn:symbol ?symbol .
-  ?generif gn:geneWikiEntryOfGn _:gnEntry .
-  _:gnEntry gn:geneWikiEntry ?gnEntry;
-            dct:creator ?author;
-            dct:created ?createdOn .
-  OPTIONAL { _:gnEntry gn:geneCategory ?geneCategory } .
-  OPTIONAL { _:gnEntry foaf:homepage ?weburl } .
-  OPTIONAL { _:gnEntry dct:source ?pmid} .
-  OPTIONAL {
-    ?generif gn:wikiEntryOfSpecies ?speciesName .
-    ?species gn:name ?speciesName ;
-             gn:binomialName ?speciesBinomialName .
-  } .
-  FILTER( lcase(?symbol) = '$symbol' )
-} GROUP BY ?author ?createdOn ?gnEntry
-           ?generif ?symbol ?weburl
-	   ?geneCategory
-ORDER BY ASC(?createdOn)""").substitute(rdf_prefixes=RDF_PREFIXES,
-                                        symbol=str(symbol).lower()))
-        ncbi_entries = sparql_query(
-            sparql_conn=SPARQLWrapper(current_app.config.get("SPARQL_ENDPOINT")),
-            query=Template("""
-$rdf_prefixes
+CONSTRUCT {
+         ?symbol ex:entries [
+              rdfs:comment ?comment ;
+              ex:species ?species_ ;
+              dct:created ?createTime ;
+              dct:references ?pmids ;
+              dct:creator ?creator ;
+              gnt:belongsToCategory ?categories ;
+         ] .
+         ?symbol rdf:type gnc:GNWikiEntry ;
+                 ex:totalCount ?totalCount ;
+                 ex:currentPage $offset .
+} WHERE {
+{
+    SELECT ?symbol ?comment (GROUP_CONCAT(DISTINCT ?speciesName; SEPARATOR='; ') AS ?species_)
+        ?createTime ?creator
+        (GROUP_CONCAT(DISTINCT ?pubmed; SEPARATOR='; ') AS ?pmids)
+        (GROUP_CONCAT(DISTINCT ?category; SEPARATOR='; ') AS ?categories)
+        WHERE {
+        ?symbol rdfs:label ?label ;
+                rdfs:comment _:entry .
+        ?label bif:contains "'$symbol'" .
+        _:entry rdf:type gnc:GNWikiEntry ;
+                rdfs:comment ?comment .
+        OPTIONAL {
+        ?species ^xkos:classifiedUnder _:entry ;
+                 ^skos:member gnc:Species ;
+                 skos:prefLabel ?speciesName .
+        } .
+        OPTIONAL { _:entry dct:created ?createTime . } .
+        OPTIONAL { _:entry dct:references ?pubmed . } .
+        OPTIONAL {
+        ?investigator foaf:name ?creator ;
+                      ^dct:creator _:entry .
+        } .
+        OPTIONAL { _:entry gnt:belongsToCategory ?category . } .
+    } GROUP BY ?comment ?symbol ?createTime ?creator ORDER BY ?createTime LIMIT $limit OFFSET $offset
+}
 
-SELECT ?speciesBinomialName (STR(?gnEntry) AS ?entry)
-       (STR(?createdOn) AS ?createdOn)
-       (GROUP_CONCAT(DISTINCT REPLACE(STR(?pmid), pubmed:, ''); SEPARATOR=',') AS ?PubMedId)
-       ?generif
-WHERE {
-  ?generif gn:symbol ?symbol .
-  ?generif gn:geneWikiEntryOfNCBI [
-    gn:geneWikiEntry ?gnEntry ;
-    dct:created ?createdOn ;
-    dct:source ?pmid
-  ] .
-  OPTIONAL {
-    ?generif gn:wikiEntryOfSpecies ?speciesName .
-    ?species gn:name ?speciesName ;
-             gn:binomialName ?speciesBinomialName .
-  } .
-  FILTER( lcase(?symbol) = '$symbol' )
-} GROUP BY ?createdOn ?gnEntry
-           ?generif ?symbol
-	   ?speciesBinomialName
-ORDER BY ASC(?createdOn)""").substitute(rdf_prefixes=RDF_PREFIXES,
-                                        symbol=str(symbol).lower()))
-        return jsonify({
-            "gn_entries": list(map(lambda x: x.data, gn_entries)),
-            "ncbi_entries": list(map(lambda x: x.data, ncbi_entries)),
-        })
+{
+        SELECT (COUNT(DISTINCT ?comment)/$limit+1 AS ?totalCount) WHERE {
+        ?symbol rdfs:comment _:entry ;
+                rdfs:label ?label .
+        _:entry rdfs:comment ?comment ;
+                rdf:type gnc:GNWikiEntry .
+        ?label bif:contains "'$symbol'" .
+        }
+}
+}
+""").substitute(prefix=RDF_PREFIXES, symbol=symbol,
+                limit=page_size, offset=page))
+        results = sparql.queryAndConvert()
+        results = json.loads(results.serialize(format="json-ld"))
+        context = {
+            "@context": PREFIXES | {
+                "data": "@graph",
+                "type": "@type",
+                "id": "@id",
+                "entries": "ex:entries",
+                "comment": "rdfs:comment",
+                "category": 'gnt:belongsToCategory',
+                "author": "dct:creator",
+                "pubmed": "dct:references",
+                "currentPage": "ex:currentPage",
+                "pages": "ex:totalCount",
+                "created": {
+                    "@id": "dct:created",
+                    "@type": "xsd:datetime"
+                },
+            },
+            "type": "gnc:GNWikiEntry"
+        }
+        return jsonld.compact(
+            jsonld.frame(results, context),
+            context)
     except (RemoteDisconnected, URLError):
-        return jsonify({
-            "gn_entries": {},
-            "ncbi_entries": {},
-        })
+        return jsonify({})