The Search Engine
Querying the Database
XNAT search engine can be queried via the REST model. It can be used to retrieve a specific subset of REST resources or a table containing the relevant values. The following queries find all the subjects that are within my_project or that have an age superior to 14.
Writing the query constraints:
>>> contraints = [('xnat:subjectData/SUBJECT_ID','LIKE','%'),
... ('xnat:subjectData/PROJECT', '=', 'my_project'),
... 'OR',
... [('xnat:subjectData/AGE','>','14'),
... 'AND'
... ]
... ]
Combining the select
statement and the where
clause to retrieve
the results. The result set will depend on the select
which accepts
paths to resources, or a specification of a table datasets with variables
from the schema.
>>> central.select('//experiments').where(contraints)
>>> central.select('xnat:subjectData',
... ['xnat:subjectData/SUBJECT_ID',
... 'xnat:subjectData/AGE']
... ).where(constraints)
Note
For additional documentation on the Search Engine:
- Search
- SearchManager
- CObject
The query syntax
Constraints for the where
clause are expressed as follows:
- A query is an unordered list that contains
1 or more constraint(s)
0 or more sub-queries (lists as this one)
- 1 comparison method between the constraints
(‘AND’ or ‘OR’)
- A constraint is an ordered tuple that contains
1 valid searchable_type/searchable_field
1 operator among ‘=’, ‘<’, ‘>’, ‘<=’, ‘>=’, ‘LIKE’
Search Help
To get the searchable types and fields to put in the contraints, rows
and columns parameters, use the datatypes`()
method:
>>> central.inspect.datatypes(optional_filter)
[..., 'xnat:subjectData', 'xnat:projectData', 'xnat:mrSessionData', ...]
>>> central.inspect.datatypes('xnat:subjectData', optional_filter)
['xnat:subjectData/SUBJECT_ID',
'xnat:subjectData/INSERT_DATE',
'xnat:subjectData/INSERT_USER',
'xnat:subjectData/GENDER_TEXT',
...]
Tip
How to get all the results in a query?
>>> central.select('xnat:subjectData',
... ['xnat:subjectData/SUBJECT_ID',
... 'xnat:subjectData/AGE']).all()
How to get all the columns from a datatype?
>>> table = central.select('xnat:subjectData').where(...)
Then to get everything:
>>> table = central.select('xnat:subjectData').all()
Search Templates
pyxnat offers a templating feature for the search engine. The first
thing is to create a template. The syntax is the same as for saving a
normal search, but values in the contraints must be keys to be re-used
in the future. In the following example sid
is a key for the subject
identifiers.
>>> central.manage.search.save_template(
... 'template_name',
... 'xnat:subjectData',
... ['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBHECT_ID'],
... [('xnat:subjectData/SUBJECT_ID', 'LIKE', 'sid'), 'AND'])
To use the template, the easiest way is through the search manager.
>>> central.manage.search.use_template('template_name',
... {'sid':'*5*'})
>>> central.manage.search.use_template('template_name',
... {'sid':'CENTRAL'})
It can also be used with the usual syntax with the select
statement.
In that case only the constraints will be used because the return
data is re-defined in the select statement.
>>> central.select('//subjects').where(template=('my_template',
... {'sid':'*5*'}))
>>> central.select('xnat:mrSessionData',
... ['xnat:mrSessionData/SESSION_ID']
... ).where(template=('my_template', {'sid':'*5*'}))
Warning
This functionality hacks a bit the search saving system
of XNAT. The only problem is that it will create saved searches
that will be names template_something
that will not work from
the web interface. Do not use this feature if it is an issue for you.
Note
For additional documentation on templates:
- use_template()
- saved_template()
- save_template()
- get_template()