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;
}