lib/rdf/reasoner/schema.rb in rdf-reasoner-0.4.0 vs lib/rdf/reasoner/schema.rb in rdf-reasoner-0.4.1
- old
+ new
@@ -25,17 +25,11 @@
def domain_compatible_schema?(resource, queryable, options = {})
raise RDF::Reasoner::Error, "#{self} can't get domains" unless property?
domains = Array(self.domainIncludes) - [RDF::OWL.Thing]
# Fully entailed types of the resource
- types = options.fetch(:types) do
- queryable.query(:subject => resource, :predicate => RDF.type).
- map {|s| (t = (RDF::Vocabulary.find_term(s.object) rescue nil)) && t.entail(:subClassOf)}.
- flatten.
- uniq.
- compact
- end unless domains.empty?
+ types = entailed_types(resource, queryable, options) unless domains.empty?
# Every domain must match some entailed type
resource_acceptable = Array(types).empty? || domains.any? {|d| types.include?(d)}
# Resource may still be acceptable if types include schema:Role, and any any other resource references `resource` using this property
@@ -107,11 +101,11 @@
when RDF::Vocab::SCHEMA.URL
resource.datatype == RDF::Vocab::SCHEMA.URL ||
resource.datatype == RDF::XSD.anyURI ||
resource.plain? && RDF::Literal::AnyURI.new(resource.value).valid?
else
- # If this is an XSD range, look for appropriate literal
+ # If may be an XSD range, look for appropriate literal
if range.start_with?(RDF::XSD.to_s)
if resource.datatype == RDF::URI(range)
true
else
# Valid if cast as datatype
@@ -125,32 +119,18 @@
end
elsif %w(True False).map {|v| RDF::Vocab::SCHEMA[v]}.include?(resource) && ranges.include?(RDF::Vocab::SCHEMA.Boolean)
true # Special case for schema boolean resources
elsif ranges.include?(RDF::Vocab::SCHEMA.URL) && resource.uri?
true # schema:URL matches URI resources
- elsif ranges.include?(RDF::Vocab::SCHEMA.Text) && resource.uri?
+ elsif ranges == [RDF::Vocab::SCHEMA.Text] && resource.uri?
# Allowed if resource is untyped
- # Fully entailed types of the resource
- types = options.fetch(:types) do
- queryable.query(:subject => resource, :predicate => RDF.type).
- map {|s| (t = (RDF::Vocabulary.find_term(s.object) rescue nil)) && t.entail(:subClassOf)}.
- flatten.
- uniq.
- compact
- end
- types.empty?
+ entailed_types(resource, queryable, options).empty?
elsif literal_range?(ranges)
false # If resource isn't literal, this is a range violation
else
# Fully entailed types of the resource
- types = options.fetch(:types) do
- queryable.query(:subject => resource, :predicate => RDF.type).
- map {|s| (t = (RDF::Vocabulary.find_term(s.object) rescue nil)) && t.entail(:subClassOf)}.
- flatten.
- uniq.
- compact
- end
+ types = entailed_types(resource, queryable, options)
# Every range must match some entailed type
resource_acceptable = Array(types).empty? || ranges.any? {|d| types.include?(d)}
# Resource may still be acceptable if it has the same property with an acceptable value
@@ -188,9 +168,21 @@
end
end
end
def self.included(mod)
+ end
+
+ private
+ # Fully entailed types
+ def entailed_types(resource, queryable, options = {})
+ options.fetch(:types) do
+ queryable.query(:subject => resource, :predicate => RDF.type).
+ map {|s| (t = (RDF::Vocabulary.find_term(s.object) rescue nil)) && t.entail(:subClassOf)}.
+ flatten.
+ uniq.
+ compact
+ end
end
end
# Extend the Term with this methods
::RDF::Vocabulary::Term.send(:include, Schema)
\ No newline at end of file