Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions src/vfb_connect/cached_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,39 @@ def cached_queries_enabled():
return os.getenv('VFB_USE_CACHED_QUERIES', 'true').lower() not in ('false', '0', 'no', 'off')


def dataset_summary_from_term_info(term_info):
"""Map a VFBquery ``get_term_info`` payload for a DataSet onto the summary
dict that ``QueryWrapper.get_DataSet_TermInfo`` has always returned
(label, symbol, id, tags, description, miniref, FlyBase, PMID, DOI).

Returns ``None`` if the payload is not a DataSet term.
"""
if not isinstance(term_info, dict) or 'DataSet' not in (term_info.get('SuperTypes') or []):
return None
meta = term_info.get('Meta') or {}
description = meta.get('Description') or ''
d = {
'label': term_info.get('Name', ''),
'symbol': '',
'id': term_info.get('Id', ''),
'tags': list(term_info.get('SuperTypes') or []),
'description': [description] if description else [],
'miniref': [], 'FlyBase': [], 'PMID': [], 'DOI': [],
}
for pub in term_info.get('Publications') or []:
d['miniref'].append(str(pub.get('title', '')))
if str(pub.get('short_form', '')).startswith('FBrf'):
d['FlyBase'].append(str(pub['short_form']))
for ref in pub.get('refs') or []:
m = re.search(r'pubmed/\?term=(\d+)', ref)
if m:
d['PMID'].append(m.group(1))
m = re.search(r'doi\.org/(.+)$', ref)
if m:
d['DOI'].append(m.group(1))
return d


class CachedQueryClient:
"""Fetch pre-computed VFBquery results, or ``None`` if they cannot be trusted.

Expand Down
20 changes: 19 additions & 1 deletion src/vfb_connect/neo/query_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -791,7 +791,25 @@ def get_DataSet_TermInfo(self, short_forms, summary=True, return_dataframe=True)
:param summary: Optional. Returns summary reports if `True`. Default `True`
:rtype: list of VFB_json or summary_report_json
"""
return self._get_TermInfo(short_forms, typ='Get JSON for DataSet', summary=summary, return_dataframe=return_dataframe)
short_forms = list(short_forms)
if not summary:
return self._get_TermInfo(short_forms, typ='Get JSON for DataSet', summary=False, return_dataframe=return_dataframe)
# Summaries come from VFBquery's cached term info: the equivalent
# Neo4j query walks has_source|SUBCLASSOF|INSTANCEOF* unbounded and can
# run for many minutes on large datasets. Anything VFBquery cannot
# serve falls back to Neo4j.
from vfb_connect.cached_query import get_default_client, dataset_summary_from_term_info
client = get_default_client()
found = {}
for sf in short_forms:
r = dataset_summary_from_term_info(client.get_term_info(sf))
if r is not None:
found[sf] = r
missing = [sf for sf in short_forms if sf not in found]
if missing:
for r in self._get_TermInfo(missing, typ='Get JSON for DataSet', summary=True, return_dataframe=return_dataframe):
found[r['id']] = r
return [found[sf] for sf in short_forms if sf in found]

def get_license_TermInfo(self, short_forms, summary=True, return_dataframe=True):
"""
Expand Down
29 changes: 29 additions & 0 deletions src/vfb_connect/test/cached_query_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,3 +182,32 @@ def test_column_contract_and_pass_through(self):

if __name__ == '__main__':
unittest.main()


class DatasetSummaryFromTermInfoTest(unittest.TestCase):
"""VFBquery DataSet term info maps onto the legacy dataset summary dict."""

def test_mapping(self):
from vfb_connect.cached_query import dataset_summary_from_term_info
ti = {
'Name': 'Ito lab adult brain lineage clone image set', 'Id': 'Ito2013',
'SuperTypes': ['Entity', 'Individual', 'DataSet', 'has_image'],
'Meta': {'Description': 'A set of clones.'},
'Publications': [{
'title': 'Ito et al., 2013, Curr. Biol. 23(8): 644--655', 'short_form': 'FBrf0221438',
'refs': ['http://www.ncbi.nlm.nih.gov/pubmed/?term=23541729',
'http://flybase.org/reports/FBrf0221438',
'https://doi.org/10.1016/j.cub.2013.03.015']}],
}
d = dataset_summary_from_term_info(ti)
self.assertEqual(d['id'], 'Ito2013')
self.assertEqual(d['description'], ['A set of clones.'])
self.assertEqual(d['miniref'], ['Ito et al., 2013, Curr. Biol. 23(8): 644--655'])
self.assertEqual(d['FlyBase'], ['FBrf0221438'])
self.assertEqual(d['PMID'], ['23541729'])
self.assertEqual(d['DOI'], ['10.1016/j.cub.2013.03.015'])

def test_non_dataset_returns_none(self):
from vfb_connect.cached_query import dataset_summary_from_term_info
self.assertIsNone(dataset_summary_from_term_info({'Id': 'FBbt_1', 'SuperTypes': ['Class']}))
self.assertIsNone(dataset_summary_from_term_info(None))
Loading