Skip to content

Commit

Permalink
Generic hierarchy (#281)
Browse files Browse the repository at this point in the history
* generic hierarchy method

* deduplicate

* action version

* upload-artifact-v3
  • Loading branch information
dsavchenko authored Oct 2, 2024
1 parent 02e47e3 commit 0f2969c
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 17 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ jobs:
papermill doc/source/user_guide/AsynchronousAPI.ipynb doc/source/user_guide/AsynchronousAPI-output.ipynb
jupyter nbconvert --to html doc/source/user_guide/AsynchronousAPI-output.ipynb
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v3
with:
name: AsynchronousAPI-output.html
path: doc/source/user_guide/AsynchronousAPI-output.html
Expand Down
42 changes: 26 additions & 16 deletions oda_api/ontology_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ def parse_limits_annotations(self, graph, infer_datatype = True):
graph.add((classuri, RDFS.subClassOf, bn))

def _get_datatype_restriction(self, param_uri):
param_uri = f"<{param_uri}>" if param_uri.startswith("http") else param_uri
param_uri = self._normalize_uri(param_uri)
query = """
SELECT ?dt WHERE {
{
Expand Down Expand Up @@ -242,31 +242,37 @@ def parse_extra_triples(self, extra_triples, format='n3', parse_oda_annotations
extra_triples = tmpg.serialize(format=format)
self.g.parse(data = extra_triples, format = format)

def get_parameter_hierarchy(self, param_uri):
param_uri_m = f"<{param_uri}>" if param_uri.startswith("http") else param_uri
def get_uri_hierarchy(self, uri, base_uri):
uri_m = self._normalize_uri(uri)
base_uri_m = self._normalize_uri(base_uri)
query = """
select ?mid ( count(?mid2) as ?midcount ) where {
%s (rdfs:subClassOf|a)* ?mid .
?mid rdfs:subClassOf* ?mid2 .
?mid2 rdfs:subClassOf* oda:WorkflowParameter .
?mid2 rdfs:subClassOf* %s .
}
group by ?mid
order by desc(?midcount)
""" % ( param_uri_m )
""" % ( uri_m, base_uri_m )

qres = self.g.query(query)

hierarchy = [str(row[0]) for row in qres]
if len(hierarchy) > 0:
return hierarchy
else:
logger.warning("%s is not in ontology or not an oda:WorkflowParameter", param_uri)
return [ param_uri ]

logger.warning("%s is not in ontology or not an %s", uri, base_uri)
return [ uri ]

def get_parameter_hierarchy(self, param_uri):
return self.get_uri_hierarchy(param_uri, base_uri='oda:WorkflowParameter')

def get_product_hierarchy(self, prod_uri):
return self.get_uri_hierarchy(prod_uri, base_uri='oda:DataProduct')

def get_parameter_format(self, param_uri, return_uri = False):
if param_uri.startswith("http"): param_uri = f"<{param_uri}>"
param_uri = self._normalize_uri(param_uri)

query = """ SELECT ?format_uri WHERE {
%s (rdfs:subClassOf|a)* [
Expand All @@ -290,7 +296,7 @@ def get_parameter_format(self, param_uri, return_uri = False):
return uri

def get_parameter_unit(self, param_uri, return_uri = False):
if param_uri.startswith("http"): param_uri = f"<{param_uri}>"
param_uri = self._normalize_uri(param_uri)

query = """SELECT ?unit_uri WHERE {
%s (rdfs:subClassOf|a)* [
Expand All @@ -314,7 +320,7 @@ def get_parameter_unit(self, param_uri, return_uri = False):
return uri

def get_limits(self, param_uri):
if param_uri.startswith("http"): param_uri = f"<{param_uri}>"
param_uri = self._normalize_uri(param_uri)

query = """
SELECT ?lim WHERE {
Expand Down Expand Up @@ -346,7 +352,7 @@ def get_limits(self, param_uri):
return (ll, ul)

def get_allowed_values(self, param_uri):
if param_uri.startswith("http"): param_uri = f"<{param_uri}>"
param_uri = self._normalize_uri(param_uri)

query = """ SELECT ?item (count(?list) as ?midcount) WHERE {
Expand Down Expand Up @@ -392,7 +398,7 @@ def get_oda_label(self, param_uri):
return self.get_direct_annotation(param_uri, "label")

def get_direct_annotation(self, param_uri, metadata, predicate="oda"):
if param_uri.startswith("http"): param_uri = f"<{param_uri}>"
param_uri = self._normalize_uri(param_uri)

query = f"SELECT ?{metadata} WHERE {{{param_uri} {predicate}:{metadata} ?{metadata}}}"

Expand All @@ -405,7 +411,7 @@ def get_direct_annotation(self, param_uri, metadata, predicate="oda"):
return metadata_value

def is_data_product(self, owl_uri, include_parameter_products=True):
if owl_uri.startswith("http"): owl_uri = f"<{owl_uri}>"
owl_uri = self._normalize_uri(owl_uri)

filt_param = 'MINUS{?cl rdfs:subClassOf* oda:ParameterProduct. }' if not include_parameter_products else ''
query = """
Expand Down Expand Up @@ -464,6 +470,10 @@ def resources():
yield dict(resource=str(resource).split('#')[-1], required=required, env_vars=env_vars)

def is_optional(self, uri: str) -> bool:
if uri.startswith("http"): uri = f"<{uri}>"
uri = self._normalize_uri(uri)
s_qres = self.g.query("ASK {%s rdfs:subClassOf? oda:optional .}" % uri )
return cast(bool, list(s_qres)[0])

@staticmethod
def _normalize_uri(uri):
return f"<{uri}>" if uri.startswith("http") else uri

0 comments on commit 0f2969c

Please sign in to comment.