#ifndef TOP_CLASS_H_
#define TOP_CLASS_H_
#include "top_model.h"
namespace model {
/////////////////////////////////////////////////////////////////////////////////////////
// class top_class
//
// This represent an OWL class managed by a top model (based on OWL/DL).
// It is associated with a resource in the rdf graph.
/////////////////////////////////////////////////////////////////////////////////////////
class top_class
{
protected:
inline top_class(top_model & model, index_type r):
m_model(model),
m_index(r),
m_asserted_base_classes(),
m_asserted_sub_classes(),
m_inferred_base_classes(),
m_inferred_sub_classes(),
m_asserted_inherited_properties(),
m_inferred_inherited_property(),
m_asserted_necessary_criteria(),
m_asserted_inherited_necessary_criteria(),
m_inferred_necessary_criteria(),
m_inferred_inherited_necessary_criteria()
{};
public:
inline ~top_class() {};
/////////////////////////////////////////////////////////////////////////////////////////
// OWL class identifiers
/////////////////////////////////////////////////////////////////////////////////////////
inline bool
has_class_identifier()const
{
return !m_index->is_bnode();
};
inline bool
is_enumeration_class()const
{
return m_model.contains(m_index, m_model.m_owl.owl_oneOf);
};
inline bool
is_property_restriction_class()const
{
return m_model.contains(m_index, m_model.m_owl.rdf_type, m_model.m_owl.owl_Restriction);
};
inline bool
is_union_of_class()const
{
return m_model.contains(m_index, m_model.m_owl.owl_unionOf);
};
inline bool
is_intersection_of_class()const
{
return m_model.contains(m_index, m_model.m_owl.owl_intersectionOf);
};
inline bool
is_asserted_disjoint_with_class()const
{
return m_model.contains_asserted(m_index, m_model.m_owl.owl_disjointWith);
};
inline bool
is_inferred_disjoint_with_class()const
{
return m_model.contains(m_index, m_model.m_owl.owl_disjointWith);
};
inline bool
is_complement_of_class()const
{
return m_model.contains_asserted(m_index, m_model.m_owl.owl_complementOf);
};
inline bool
is_inconsistent_class()const
{
return m_model.contains(m_index, m_model.m_owl.rdfs_subClassOf, m_model.m_owl.owl_Nothing);
};
/////////////////////////////////////////////////////////////////////////////////////////
// OWL enumeration class - enumerated individuals using owl:oneOf construct
/////////////////////////////////////////////////////////////////////////////////////////
inline rdf_graph_iterator_by_object
get_asserted_enumerated_individuals()const
{
return rdf_graph_iterator_by_object(m_model.find_asserted_objects(m_index, m_model.m_owl.owl_oneOf), index_triple_lookup_by_object());
};
inline rdf_session_iterator_by_object
get_inferred_enumerated_individuals()const
{
return rdf_session_iterator_by_object(m_model.find_objects(m_index, m_model.m_owl.owl_oneOf), index_triple_lookup_by_object());
};
/////////////////////////////////////////////////////////////////////////////////////////
// OWL property restriction
/////////////////////////////////////////////////////////////////////////////////////////
inline bool
is_all_value_from_restriction_type()const
{
return m_model.contains_asserted(m_index, m_model.m_owl.owl_allValuesFrom);
};
inline bool
is_some_value_from_restriction_type()const
{
return m_model.contains_asserted(m_index, m_model.m_owl.owl_someValuesFrom);
};
inline bool
is_has_value_restriction_type()const
{
return m_model.contains_asserted(m_index, m_model.m_owl.owl_hasValue);
};
inline bool
is_max_cardinality_restriction_type()const
{
return m_model.contains_asserted(m_index, m_model.m_owl.owl_maxCardinality);
};
inline bool
is_min_cardinality_restriction_type()const
{
return m_model.contains_asserted(m_index, m_model.m_owl.owl_minCardinality);
};
inline bool
is_cardinality_restriction_type()const
{
return m_model.contains_asserted(m_index, m_model.m_owl.owl_cardinality);
};
inline index_type
get_on_property_restriction()const
{
return m_model.find_functional_asserted_object(m_index, m_model.m_owl.owl_onProperty);
};
inline rdf::literal const&
get_max_cardinality_restriction()const
{
return m_model.get_rdf_session()->get_literal(m_model.find_functional_asserted_object(m_index, m_model.m_owl.owl_maxCardinality));
};
inline rdf::literal const&
get_min_cardinality_restriction()const
{
return m_model.get_rdf_session()->get_literal(m_model.find_functional_asserted_object(m_index, m_model.m_owl.owl_minCardinality));
};
inline rdf::literal const&
get_cardinality_restriction()const
{
return m_model.get_rdf_session()->get_literal(m_model.find_functional_asserted_object(m_index, m_model.m_owl.owl_cardinality));
};
inline top_class_ptr_type
get_all_value_from_restriction()const
{
index_type index = m_model.find_functional_asserted_object(m_index, m_model.m_owl.owl_allValuesFrom);
return m_model.get_top_class(index);
};
inline top_class_ptr_type
get_some_value_from_restriction()const
{
index_type index = m_model.find_functional_asserted_object(m_index, m_model.m_owl.owl_someValuesFrom);
return m_model.get_top_class(index);
};
inline index_type
get_has_value_restriction()const
{
return m_model.find_functional_asserted_object(m_index, m_model.m_owl.owl_hasValue);
};
/////////////////////////////////////////////////////////////////////////////////////////
// OWL union, intersection, complement restrictions
/////////////////////////////////////////////////////////////////////////////////////////
inline top_class_lookup_iterator_by_asserted_object
get_asserted_union_of_classes()const
{
return top_class_lookup_iterator_by_asserted_object(m_model.find_asserted_objects(m_index, m_model.m_owl.owl_unionOf), top_class_lookup_by_object(m_model));
};
inline top_class_lookup_iterator_by_object
get_inferred_union_of_classes()const
{
return top_class_lookup_iterator_by_object(m_model.find_objects(m_index, m_model.m_owl.owl_unionOf), top_class_lookup_by_object(m_model));
};
inline top_class_lookup_iterator_by_asserted_object
get_asserted_intersection_of_classes()const
{
return top_class_lookup_iterator_by_asserted_object(m_model.find_asserted_objects(m_index, m_model.m_owl.owl_intersectionOf), top_class_lookup_by_object(m_model));
};
inline top_class_lookup_iterator_by_object
get_inferred_intersection_of_classes()const
{
return top_class_lookup_iterator_by_object(m_model.find_objects(m_index, m_model.m_owl.owl_intersectionOf), top_class_lookup_by_object(m_model));
};
inline top_class_lookup_iterator_by_asserted_object
get_asserted_disjoint_with_classes()const
{
return top_class_lookup_iterator_by_asserted_object(m_model.find_asserted_objects(m_index, m_model.m_owl.owl_disjointWith), top_class_lookup_by_object(m_model));
};
inline top_class_lookup_iterator_by_object
get_inferred_disjoint_with_classes()const
{
return top_class_lookup_iterator_by_object(m_model.find_objects(m_index, m_model.m_owl.owl_disjointWith), top_class_lookup_by_object(m_model));
};
inline index_type
get_complement_of_class()const
{
return m_model.find_functional_asserted_object(m_index, m_model.m_owl.owl_complementOf);
};
/////////////////////////////////////////////////////////////////////////////////////////
// OWL property membership
/////////////////////////////////////////////////////////////////////////////////////////
inline top_property_lookup_iterator_by_asserted_subject
get_asserted_property_membership()const
{
return top_property_lookup_iterator_by_asserted_subject(
m_model.find_asserted_subjects(m_model.m_owl.rdfs_domain, m_index),
top_property_lookup_by_subject(m_model));
};
inline top_property_lookup_iterator_by_subject
get_inferred_property_membership()const
{
return top_property_lookup_iterator_by_subject(
m_model.find_subjects(m_model.m_owl.rdfs_domain, m_index),
top_property_lookup_by_subject(m_model));
};
top_property_lookup_const_iterator
get_asserted_inherited_property_membership()const;
top_property_lookup_const_iterator
get_inferred_inherited_property_membership()const;
/////////////////////////////////////////////////////////////////////////////////////////
inline void
clear_inferred_info()
{
m_inferred_base_classes.clear();
m_inferred_sub_classes.clear();
};
/////////////////////////////////////////////////////////////////////////////////////////
// direct base and sub classes
/////////////////////////////////////////////////////////////////////////////////////////
inline void
add_asserted_base_class(top_class_ptr_type const& c)
{
m_asserted_base_classes.insert(std::make_pair(c->get_index(), c));
};
inline void
add_asserted_sub_class(top_class_ptr_type const& c)
{
m_asserted_sub_classes.insert(std::make_pair(c->get_index(), c));
};
inline void
add_inferred_base_class(top_class_ptr_type const& c)
{
m_inferred_base_classes.insert(std::make_pair(c->get_index(), c));
};
inline void
add_inferred_sub_class(top_class_ptr_type const& c)
{
m_inferred_sub_classes.insert(std::make_pair(c->get_index(), c));
};
inline index_type
get_index()const
{
return m_index;
};
inline bool
has_asserted_equivalent_classes()const
{
return m_model.contains_asserted(m_index, m_model.m_owl.owl_equivalentClass);
};
inline top_class_lookup_iterator_by_asserted_object
get_asserted_equivalent_classes()const
{
return top_class_lookup_iterator_by_asserted_object(
m_model.find_asserted_objects(m_index, m_model.m_owl.owl_equivalentClass),
top_class_lookup_by_object(m_model));
};
inline bool
has_inferred_equivalent_classes()const
{
return m_model.contains(m_index, m_model.m_owl.owl_equivalentClass);
};
inline top_class_lookup_iterator_by_object
get_inferred_equivalent_classes()const
{
return top_class_lookup_iterator_by_object(
m_model.find_objects(m_index, m_model.m_owl.owl_equivalentClass),
top_class_lookup_by_object(m_model));
};
top_class_lookup_const_iterator
get_asserted_necessary_criteria()const;
top_class_lookup_const_iterator
get_asserted_inherited_necessary_criteria()const;
top_class_lookup_const_iterator
get_inferred_necessary_criteria()const;
top_class_lookup_const_iterator
get_inferred_inherited_necessary_criteria()const;
inline top_class_const_iterator
get_asserted_direct_base_classes()const
{
return top_class_const_iterator(m_asserted_base_classes.begin(), m_asserted_base_classes.end());
};
inline top_class_const_iterator
get_asserted_direct_sub_classes()const
{
return top_class_const_iterator(m_asserted_sub_classes.begin(), m_asserted_sub_classes.end());
};
inline top_class_const_iterator
get_inferred_direct_base_classes()const
{
return top_class_const_iterator(m_inferred_base_classes.begin(), m_inferred_base_classes.end());
};
inline top_class_const_iterator
get_inferred_direct_sub_classes()const
{
return top_class_const_iterator(m_inferred_sub_classes.begin(), m_inferred_sub_classes.end());
};
inline top_class_lookup_iterator_by_object
get_all_inferred_base_classes()const
{
return top_class_lookup_iterator_by_object(
m_model.find_objects(m_index, m_model.m_owl.rdfs_subClassOf),
top_class_lookup_by_object(m_model));
};
bool
operator==(top_class const& rhs)const
{
return m_index == rhs.m_index;
};
bool
operator!=(top_class const& rhs)const
{
return m_index != rhs.m_index;
};
private:
friend std::ostream& operator<<(std::ostream& out, top_class const& c);
friend class top_model;
top_model & m_model;
index_type m_index;
top_class_map_type m_asserted_base_classes;
top_class_map_type m_asserted_sub_classes;
top_class_map_type m_inferred_base_classes;
top_class_map_type m_inferred_sub_classes;
mutable index_type_vector_type m_asserted_inherited_properties;
mutable index_type_vector_type m_inferred_inherited_property;
mutable index_type_vector_type m_asserted_necessary_criteria;
mutable index_type_vector_type m_asserted_inherited_necessary_criteria;
mutable index_type_vector_type m_inferred_necessary_criteria;
mutable index_type_vector_type m_inferred_inherited_necessary_criteria;
};
inline std::ostream& operator<<(std::ostream& out, top_class const& c)
{
out << rdf::internal::to_resource_base(c.m_index);
out << "\n has for asserted base classes: ";
top_class_const_iterator itor = c.get_asserted_direct_base_classes();
while(!itor.is_end()) {
out << rdf::internal::to_resource_base(itor.get_value()->get_index()) << ", ";
itor.next();
}
out << "\n has for asserted sub classes: ";
itor = c.get_asserted_direct_sub_classes();
while(!itor.is_end()) {
out << rdf::internal::to_resource_base(itor.get_value()->get_index()) << ", ";
itor.next();
}
out << "\n has for inferred base classes: ";
itor = c.get_inferred_direct_base_classes();
while(!itor.is_end()) {
out << rdf::internal::to_resource_base(itor.get_value()->get_index()) << ", ";
itor.next();
}
out << "\n has for inferred sub classes: ";
itor = c.get_inferred_direct_sub_classes();
while(!itor.is_end()) {
out << rdf::internal::to_resource_base(itor.get_value()->get_index()) << ", ";
itor.next();
}
out << "\n-----------------\n";
return out;
};
}; /* model namespace */
#endif /*TOP_CLASS_H_*/