private static HashSet GetDtdlTriplesForRange()

in OWL2DTDL/Program.cs [790:890]


        private static HashSet<Triple> GetDtdlTriplesForRange(OntologyClass owlPropertyRange, INode dtdlPropertyNode)
        {

            // TODO: ensure that owlPropertyRange is named!

            IGraph dtdlModel = dtdlPropertyNode.Graph;
            IUriNode dtdl_schema = dtdlModel.CreateUriNode(DTDL.schema);
            IUriNode rdfType = dtdlModel.CreateUriNode(UriFactory.Create(RdfSpecsHelper.RdfType));
            IUriNode dtdl_Enum = dtdlModel.CreateUriNode(DTDL.Enum);
            IUriNode dtdl_valueSchema = dtdlModel.CreateUriNode(DTDL.valueSchema);
            IUriNode dtdl_enumValues = dtdlModel.CreateUriNode(DTDL.enumValues);
            IUriNode dtdl_name = dtdlModel.CreateUriNode(VocabularyHelper.DTDL.name);
            IUriNode dtdl_displayName = dtdlModel.CreateUriNode(VocabularyHelper.DTDL.displayName);
            IUriNode dtdl_enumValue = dtdlModel.CreateUriNode(DTDL.enumValue);
            IUriNode dtdl_comment = dtdlModel.CreateUriNode(DTDL.comment);
            IUriNode dtdl_string = dtdlModel.CreateUriNode(DTDL._string);
            IUriNode dtdl_unit = dtdlModel.CreateUriNode(DTDL.unit);

            HashSet<Triple> returnedTriples = new HashSet<Triple>();

            // First check for the simple XSD datatypes
            if (owlPropertyRange.IsXsdDatatype())
            {
                Uri schemaUri = GetXsDatatypeAsDtdlEquivalent(owlPropertyRange);
                IUriNode schemaNode = dtdlModel.CreateUriNode(schemaUri);
                returnedTriples.Add(new Triple(dtdlPropertyNode, dtdl_schema, schemaNode));
                return returnedTriples;
            }

            // Then check for supported custom-defined datatypes
            if (owlPropertyRange.IsDatatype() && !owlPropertyRange.IsBuiltIn())
            {
                // This is an enumeration of allowed values
                if (owlPropertyRange.IsEnumerationDatatype())
                {
                    IBlankNode enumNode = dtdlModel.CreateBlankNode();
                    returnedTriples.Add(new Triple(enumNode, rdfType, dtdl_Enum));
                    returnedTriples.Add(new Triple(dtdlPropertyNode, dtdl_schema, enumNode));
                    returnedTriples.Add(new Triple(enumNode, dtdl_valueSchema, dtdl_string));
                    IEnumerable<ILiteralNode> enumOptions = owlPropertyRange.AsEnumeration().LiteralNodes();
                    foreach (ILiteralNode option in enumOptions)
                    {
                        IBlankNode enumOption = dtdlModel.CreateBlankNode();
                        returnedTriples.Add(new Triple(enumOption, dtdl_name, dtdlModel.CreateLiteralNode(option.Value)));
                        returnedTriples.Add(new Triple(enumOption, dtdl_enumValue, dtdlModel.CreateLiteralNode(option.Value)));
                        returnedTriples.Add(new Triple(enumNode, dtdl_enumValues, enumOption));
                    }
                    return returnedTriples;
                }

                // This is a wrapper around a XSD standard datatype
                if (owlPropertyRange.IsSimpleXsdWrapper())
                {
                    Uri schemaUri = GetXsDatatypeAsDtdlEquivalent(owlPropertyRange.EquivalentClasses.First());
                    IUriNode schemaNode = dtdlModel.CreateUriNode(schemaUri);
                    returnedTriples.Add(new Triple(dtdlPropertyNode, dtdl_schema, schemaNode));

                    // If the wrapper is a punned QUDT unit individual, assign semantic type and unit
                    if (owlPropertyRange.IsQudtUnit() && semanticTypesMap.ContainsKey(owlPropertyRange.GetUri()))
                    {
                        Uri qudtUnit = owlPropertyRange.GetUri();
                        IUriNode hasQuantityKind = dtdlModel.CreateUriNode(QUDT.hasQuantityKind);
                        IEnumerable<IUriNode> quantityKinds = owlPropertyRange.GetNodesViaPredicate(hasQuantityKind).UriNodes();
                        if (quantityKinds.Count() == 1 && semanticTypesMap.ContainsKey(quantityKinds.First().Uri))
                        {
                            Uri qudtQuantityKind = quantityKinds.First().Uri;
                            IUriNode dtdlSemanticType = dtdlModel.CreateUriNode(semanticTypesMap[qudtQuantityKind]);
                            IUriNode dtdlUnit = dtdlModel.CreateUriNode(semanticTypesMap[qudtUnit]);
                            returnedTriples.Add(new Triple(dtdlPropertyNode, rdfType, dtdlSemanticType));
                            returnedTriples.Add(new Triple(dtdlPropertyNode, dtdl_unit, dtdlUnit));
                        }
                    }

                    // Assert comment from XSD datatype on parent DTDL property (prioritizing non-tagged, then english, then anything else)
                    if (owlPropertyRange.Comment.Any())
                    {
                        IEnumerable<ILiteralNode> englishOrNontaggedComments = owlPropertyRange.Comment
                            .Where(node => node.Language == string.Empty || node.Language.StartsWith("en"))
                            .OrderBy(node => node.Language);
                        ILiteralNode comment;
                        if (englishOrNontaggedComments.Any())
                        {
                            comment = englishOrNontaggedComments.First();
                        }
                        else
                        {
                            comment = owlPropertyRange.Comment.First();
                        }
                        ILiteralNode dtdlCommentNode = dtdlModel.CreateLiteralNode(string.Concat(comment.Value.Take(512)));
                        Triple dtdlCommentTriple = new Triple(dtdlPropertyNode, dtdl_comment, dtdlCommentNode);
                        returnedTriples.Add(dtdlCommentTriple);
                    }
                    return returnedTriples;
                }
            }

            // No supported schemas found; fall back to simple string schema
            IUriNode stringSchemaNode = dtdlModel.CreateUriNode(DTDL._string);
            returnedTriples.Add(new Triple(dtdlPropertyNode, dtdl_schema, stringSchemaNode));
            return returnedTriples;
        }