/// <summary>
        /// Takes a data value from the _queryResults datatable and returns a marshalled data object.
        /// </summary>
        /// <param name="cellValue">A cell value from a Virtuoso results datatable.</param>
        /// <returns>A reference to the marshalled data object.</returns>
        private object ParseCellValue(object cellValue)
        {
            if (cellValue is SqlExtendedString)
            {
                SqlExtendedString extendedString = cellValue as SqlExtendedString;

                if (extendedString.IsResource())
                {
                    // NOTE: We create an UriRef for correct equality comparision with fragment identifiers.
                    return(new UriRef(extendedString.ToString(), UriKind.RelativeOrAbsolute));
                }
                else if (extendedString.IsString() || extendedString.IsBlankId())
                {
                    return(extendedString.ToString());
                }
            }
            else if (cellValue is SqlRdfBox)
            {
                SqlRdfBox box = cellValue as SqlRdfBox;

                if (box.StrType != null)
                {
                    try
                    {
                        // NOTE: We create an UriRef for correct equality comparision with fragment identifiers.
                        return(XsdTypeMapper.DeserializeString(box.Value.ToString(), new UriRef(box.StrType)));
                    }
                    catch (KeyNotFoundException)
                    {
                        // The given data type is not known by the XsdTypeMapper.
                        return(box.Value.ToString());
                    }
                }
                else if (box.Value is SqlExtendedString && box.StrLang != null)
                {
                    return(new Tuple <string, CultureInfo>(box.Value.ToString(), new CultureInfo(box.StrLang)));
                }
                else if (box.Value != null)
                {
                    return(box.Value.ToString());
                }
            }
            else if (cellValue is int)
            {
                // TODO: We need a different approach to store and read booleans.
                return(cellValue);
            }
            else if (cellValue is DateTime)
            {
                // Virtuoso delivers the time not as UTC but as "unspecified"
                // we convert it to local time
                return(((DateTime)cellValue).ToLocalTime());
            }
            else if (cellValue is VirtuosoDateTimeOffset)
            {
                return(((VirtuosoDateTimeOffset)cellValue).Value.UtcDateTime.ToUniversalTime());
            }

            return(cellValue);
        }
 public static bool IsString(this SqlExtendedString extendedString)
 {
     return(extendedString.IriType == SqlExtendedStringType.IRI && extendedString.StrType == SqlExtendedStringType.BNODE);
 }
 public static bool IsBlankId(this SqlExtendedString extendedString)
 {
     return(extendedString.IriType == SqlExtendedStringType.BNODE);
 }
 public static bool IsResource(this SqlExtendedString extendedString)
 {
     return(extendedString.IriType == SqlExtendedStringType.IRI && extendedString.StrType == SqlExtendedStringType.IRI);
 }