Relational Queries
Relational Queries have been in the DICOM standard since the start, but are supported by only about half the PACS in the world. They are negotiated using Extended Negotiation and if requested by the SCU and accepted by the SCP then they remove several of the normal C-FIND rules, namely:
- It is no longer necessary to quote the unique identifiers for every level above the current query level
- It is possible to use matching attributes at different levels of the hierarchy
e.g. with standard queries, it would not be possible to include series and study queries in the same request, but with hierarchical queries that is allowed.
In DicomObjects, to use these as an SCU:
- Create and set up a DicomConnection/DicomAssociation object
- Add the appropriate C-FIND Presentation Context
- Set the ExtendedNegotiationValues COM/.NET property of that context to a one byte array containing the value 1
- Use SetDestination/Open as normal
- Check the ExtendedNegotiationValues COM/.NET property of the C-FIND context to see if it has been accepted by the SCP (and if not, then keep to normal DICOM query rules)
In DicomObjects, to use these as an SCP:
- Set DicomGlobal.EnableExtendedNegotiation to true
- If the AssociationRequest COM/.NET event, check the value of the ExtendedNegotiationValues COM/.NET property of the requested contexts, and leave at 1 if you accept, or set to 0 if you do not.
SCU use in DicomObjects
The following code is a simple example, which does a series level relational query against the Medical Connections Public DICOM Server. Note that the Patient ID and Study UID which would otherwise be required for a series level query are not specified.
DicomObjects.NET version
DicomAssociation cn= new DicomAssociation();
DicomContext ctx = cn.RequestedContexts.Add(SOPClasses.StudyRootQR_FIND);
ctx.ExtendedNegotiationValues = new byte[]{1};
cn.Open( "Dicomserver.co.uk", 104, "CallingAE", "CalledAE");
DicomDataSet ds = new DicomDataSet();
ds.Add(Keyword.QueryRetrieveLevel, "SERIES");
ds.Add(Keyword.StudyDate, "");
ds.Add(Keyword.StudyDescription, "");
ds.Add(Keyword.SeriesDescription, "OBL*");// series description must begin with "OBL"
ds.Add(Keyword.PatientName, "");
ds.Add(Keyword.PatientID, "");
ds.Add(Keyword.StudyID, "");
ds.Add(Keyword.StudyInstanceUID, "");
ds.Add(Keyword.SeriesInstanceUID, "");
ds.Add(Keyword.SeriesNumber, "");
cn.Find( QueryRoot.Study, ds);
// res holds all response datasets
DicomDataSetCollection res = cn.ReturnedIdentifiers;
cn.Close();
DicomObjects.COM version
Dim g As New DicomGlobal
g.EnableExtendedNegotiation = True
Dim cn As New DicomConnection
Dim cxt As DicomContext
Set cxt = cn.Contexts.Add(DicomObjects.Constants.doSOP_StudyRootQR_FIND)
cxt.ExtendedNegotiationValues = 1
cn.SetDestination "Dicomserver.co.uk", 104, "CallingAE", "CalledAE"
Dim ds As New DicomDataSet
ds.Attributes.Add &H8, &H52, "SERIES" ' all attributes must still be at or above the level used
ds.Attributes.Add &H8, &H20, "" ' Give me the study date.
ds.Attributes.Add &H8, &H1030, "" ' give me the Study name / description.
ds.Attributes.Add &H8, &H103E, "OBL*" ' series description must begin with....
ds.Attributes.Add &H10, &H10, "" ' Give me the patient name.
ds.Attributes.Add &H10, &H20, "*" ' Give me the patient id.
ds.Attributes.Add &H20, &H10, "" ' for this study ID.
ds.Attributes.Add &H20, &HD, "" ' give me the study instance UID.
ds.Attributes.Add &H20, &HE, "" ' give me the series instance UID.
ds.Attributes.Add &H20, &H11, "" ' give me the series number.
cn.Find "STUDY", ds
Set res = cn.ReturnedDataSets
cn.Close