More on Paths

The paths which are passed as arguments to select can take different forms. They are in fact compatible with native REST calls, except for query strings in the URLs (see XNAT doc and Wikipedia for more on query strings). They also expose additional functionalities and can easily generate thousands of queries in a single statement.

Absolute Paths

A full path to a resource is a sequence of resource level and resource_id pairs, whereas a full path to a resource listing is a sequence of resource level and resource_id pairs finishing by a plural resource level (i.e. with an ‘s’)

>>> central.select('/project/IMAGEN/subject/000055982442')
>>> central.select('/project/IMAGEN/subject/000055982442/experiments')

The select statement is smart enough to deal with plural and singluar resources names which means that the following paths are equivalent in pyxnat.

>>> central.select('/project/IMAGEN/subject/000055982442/experiments')
>>> central.select('/project/IMAGEN/subjects/000055982442/experiment')

Relative Paths and Shortcuts

When browsing resources, some levels are often left without any IDs and filled with * filters instead, which leads to paths like.

>>> central.select('/projects/*/subjects/*/experiments/*')

pyxnat offers shorter ways to do it. There are intended to explore faster the database from an interactive python shell such as ipython, but not in production programs where using Python string replacement capabilities to generate identifiers is always faster. The previous statement is equivalent to the following calls:

>>> central.select('/projects/subjects/experiments')
>>> central.select('//experiments')

Another example to get all the experiments from a specific project.

>>> central.select('/project/IMAGEN//experiments')
>>> central.select('/project/IMAGEN/subjects/*/experiments')

The double slash syntax can be used anywhere in the path and any number of time to avoid writing unused levels in the path.

>>> central.select('//subjects//assessors')
>>> central.select('/projects/*/subjects/*/experiments/*/assessors/*')

A path will generate several paths and thus several queries if it’s ambiguous and can be interpreted in differents ways. For example the path //subjects//assessors//files generates:

/projects/*/subjects/*/experiments/*/assessors/*/in_resources/*/files/*
/projects/*/subjects/*/experiments/*/assessors/*/out_resources/*/files/*
/projects/*/subjects/*/experiments/*/assessors/*/resources/*/files/*

Warning

If you try //files, it will generate all the possible descendant paths. If the server has a large amount a data it will take ages to go through all the resources:

/projects//subjects//experiments//resources//files/*
/projects//subjects//experiments//reconstructions//in_resources//files/
/projects//subjects//experiments//scans//resources//files/
/projects//subjects//experiments//assessors//out_resources//files/
/projects//subjects//resources//files/
/projects//resources//files/*
/projects//subjects//experiments//reconstructions//out_resources//files/
/projects//subjects//experiments//assessors//in_resources//files/
/projects//subjects//experiments//assessors//resources//files/