OWL2DTDL/OntologyRestriction.cs (109 lines of code) (raw):

using System.Collections.Generic; using System.Globalization; using System.Linq; using VDS.RDF; using VDS.RDF.Ontology; namespace OWL2DTDL { /// <summary> /// (Partial) representation of an owl:Restriction. /// </summary> public class OntologyRestriction { public OntologyProperty OnProperty { get { IUriNode onProperty = _graph.CreateUriNode(VocabularyHelper.OWL.onProperty); IEnumerable<IUriNode> properties = _wrappedClass.GetNodesViaPredicate(onProperty).UriNodes(); if (properties.Count() != 1) { throw new RdfException("A restriction must be on exactly one property."); } return _graph.CreateOntologyProperty(properties.First()); } } public OntologyClass OnClass { get { IUriNode onClass = _graph.CreateUriNode(VocabularyHelper.OWL.onClass); IUriNode allValuesFrom = _graph.CreateUriNode(VocabularyHelper.OWL.allValuesFrom); IUriNode someValuesFrom = _graph.CreateUriNode(VocabularyHelper.OWL.someValuesFrom); IEnumerable<INode> classes = _wrappedClass.GetNodesViaPredicate(onClass) .Union(_wrappedClass.GetNodesViaPredicate(someValuesFrom)) .Union(_wrappedClass.GetNodesViaPredicate(allValuesFrom)); if (classes.Count() == 0) { if (OnProperty.IsObjectProperty()) { return _graph.CreateOntologyClass(VocabularyHelper.OWL.Thing); } else { return _graph.CreateOntologyClass(VocabularyHelper.RDFS.Literal); } } else if (classes.Count() == 1) { return _graph.CreateOntologyClass(classes.First()); } throw new RdfException("A restriction must be on at most one class."); } } public int MinimumCardinality { get { IUriNode someValuesFrom = _graph.CreateUriNode(VocabularyHelper.OWL.someValuesFrom); IUriNode minCardinality = _graph.CreateUriNode(VocabularyHelper.OWL.minCardinality); IUriNode minQualifiedCardinality = _graph.CreateUriNode(VocabularyHelper.OWL.minQualifiedCardinality); IEnumerable<INode> minCardinalities = _wrappedClass.GetNodesViaPredicate(minCardinality).Union(_wrappedClass.GetNodesViaPredicate(minQualifiedCardinality)); if (minCardinalities.LiteralNodes().Count() == 1 && minCardinalities.LiteralNodes().First().IsInteger()) { return int.Parse(minCardinalities.LiteralNodes().First().Value, CultureInfo.InvariantCulture); } if (_wrappedClass.GetNodesViaPredicate(someValuesFrom).Count() == 1) { return 1; } return 0; } } public int ExactCardinality { get { IUriNode cardinality = _graph.CreateUriNode(VocabularyHelper.OWL.cardinality); IUriNode qualifiedCardinality = _graph.CreateUriNode(VocabularyHelper.OWL.qualifiedCardinality); IEnumerable<INode> exactCardinalities = _wrappedClass.GetNodesViaPredicate(cardinality).Union(_wrappedClass.GetNodesViaPredicate(qualifiedCardinality)); if (exactCardinalities.LiteralNodes().Count() == 1 && exactCardinalities.LiteralNodes().First().IsInteger()) { return int.Parse(exactCardinalities.LiteralNodes().First().Value, CultureInfo.InvariantCulture); } return 0; } } public int MaximumCardinality { get { IUriNode maxCardinality = _graph.CreateUriNode(VocabularyHelper.OWL.maxCardinality); IUriNode maxQualifiedCardinality = _graph.CreateUriNode(VocabularyHelper.OWL.maxQualifiedCardinality); IEnumerable<INode> maxCardinalities = _wrappedClass.GetNodesViaPredicate(maxCardinality).Union(_wrappedClass.GetNodesViaPredicate(maxQualifiedCardinality)); if (maxCardinalities.LiteralNodes().Count() == 1 && maxCardinalities.LiteralNodes().First().IsInteger()) { return int.Parse(maxCardinalities.LiteralNodes().First().Value, CultureInfo.InvariantCulture); } return 0; } } public readonly OntologyGraph _graph; public readonly OntologyClass _wrappedClass; /// <summary> /// Wrapper around an ontology class that exposes some methods particular to ontology restrictions. /// </summary> /// <param name="wrappedClass"></param> public OntologyRestriction(OntologyClass wrappedClass) { _wrappedClass = wrappedClass; _graph = wrappedClass.Graph as OntologyGraph; } } }