aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gn3/api/metadata.py10
-rw-r--r--gn3/db/rdf.py40
2 files changed, 50 insertions, 0 deletions
diff --git a/gn3/api/metadata.py b/gn3/api/metadata.py
index b54f032..1330b6f 100644
--- a/gn3/api/metadata.py
+++ b/gn3/api/metadata.py
@@ -9,6 +9,7 @@ from flask import current_app
from SPARQLWrapper import SPARQLWrapper
from gn3.db.rdf import get_dataset_metadata
+from gn3.db.rdf import get_publication_metadata
from gn3.db.rdf import sparql_query
from gn3.db.rdf import RDF_PREFIXES
@@ -31,9 +32,18 @@ def dataset(name):
return jsonify({})
+@metadata.route("/publication/<name>", methods=["GET"])
+def publication(name):
+ """Fetch a dataset's metadata given it's ACCESSION_ID"""
try:
+ if "unpublished" in name:
+ name = f"gn:{name}"
+ else:
+ name = f"publication:{name}"
return jsonify(
+ get_publication_metadata(
SPARQLWrapper(current_app.config.get("SPARQL_ENDPOINT")),
+ name,
).data
)
# The virtuoso server is misconfigured or it isn't running at all
diff --git a/gn3/db/rdf.py b/gn3/db/rdf.py
index 5b62b46..c559774 100644
--- a/gn3/db/rdf.py
+++ b/gn3/db/rdf.py
@@ -156,6 +156,46 @@ CONSTRUCT {
):
response[key] = value.map(get_url_local_name) # type: ignore
return response
+
+
+def get_publication_metadata(
+ sparql_conn: SPARQLWrapper, name: str
+):
+ """Return info about a publication with a given NAME"""
+ __metadata_query = """
+$prefix
+
+CONSTRUCT {
+ gn:publication ?publicationTerm ?publicationValue .
+ gn:publication ?predicate ?subject .
+} WHERE {
+ $name ?publicationTerm ?publicationValue .
+ ?publication ?publicationTerm ?publicationValue .
+ OPTIONAL {
+ ?subject ?predicate ?publication .
+ } .
+ VALUES ?publicationTerm {
+ gn:pubMedId gn:title gn:volume
+ gn:abstract gn:pages gn:month gn:year gn:author
+ }
+ VALUES ?predicate {
+ gn:phenotypeOfPublication
+ }
+}
+"""
+ response: MonadicDict = MonadicDict()
+
+ for key, value in sparql_query(
+ sparql_conn,
+ Template(__metadata_query)
+ .substitute(
+ prefix=RDF_PREFIXES,
+ name=name
+ )
+ )[0].items():
+ response[key] = value
+ if isinstance(value, str) and not key.endswith("pubMedId"):
+ response[key] = value.map(get_url_local_name) # type: ignore
return response