in OWL2DTDL/Program.cs [1052:1117]
private static string GetDTMI(OntologyResource resource)
{
if (!resource.IsNamed())
{
throw new RdfException($"Could not generate DTMI for OntologyResource '{resource}'; resource is anonymous.");
}
// Get the resource namespace for DTMI minting (see below)
Uri resourceNamespace = resource.GetNamespace();
char[] uriTrimChars = { '#', '/' };
// Ensure that the resource is in the namespace mapper. Why do we do this again?
if (!namespacePrefixes.ContainsKey(resourceNamespace))
{
string namespaceShortName = resourceNamespace.AbsoluteUri.Trim(uriTrimChars).Split('/').Last();
namespacePrefixes[resourceNamespace] = namespaceShortName;
}
// Combine (reversed) host and path component arrays to create namespace components array
string[] hostComponents = resourceNamespace.Host.Split('.');
Array.Reverse(hostComponents);
string[] pathComponents = resourceNamespace.AbsolutePath.Trim(uriTrimChars).Split('/');
string[] namespaceComponents = hostComponents.Concat(pathComponents).ToArray();
// The ontologyName is the last component in the namespace array
string ontologyName = namespaceComponents.Last();
// If an ontology source has been set at CLI option, use it; otherwise generate from the namespace
// components array (omitting the previously extracted ontologyName component)
string ontologySource;
if (_ontologySource != null)
{
ontologySource = _ontologySource;
}
else
{
string[] ontologySourceComponents = namespaceComponents.Take(namespaceComponents.Count() - 1).ToArray();
ontologySource = string.Join(':', ontologySourceComponents);
}
// Put together the pieces
string dtmi = $"{ontologySource}:{ontologyName}:{resource.GetLocalName()}";
// Run the candidate DTMI through validation per the spec, removing non-conforming chars
string[] pathSegments = dtmi.Split(':');
for (int i = 0; i < pathSegments.Length; i++)
{
string pathSegment = pathSegments[i];
pathSegment = new string((from c in pathSegment
where char.IsLetterOrDigit(c) || c.Equals('_')
select c
).ToArray());
pathSegment = pathSegment.TrimEnd('_');
pathSegment = pathSegment.TrimStart(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'});
pathSegments[i] = pathSegment;
}
dtmi = string.Join(':', pathSegments);
string dtmiVersion = "1";
if (resource.HasOwlVersionInfo()) {
dtmiVersion = resource.GetOwlVersionInfo();;
}
// Add prefix and suffix
return $"dtmi:digitaltwins:{dtmi};{dtmiVersion}";
}