First version of a owl:sameAs library
|Thu Dec 2 13:39:15 2010 +0100|
|Thu Dec 2 13:39:15 2010 +0100|
Diff style: patch stat
diff --git a/config-available/DEFAULTS b/config-available/DEFAULTS deleted file mode 100644 index d50f569..0000000 --- a/config-available/DEFAULTS +++ /dev/null @@ -1 +0,0 @@ -config(owl, link). diff --git a/config-available/owl.pl b/config-available/owl.pl deleted file mode 100644 index b35c969..0000000 --- a/config-available/owl.pl +++ /dev/null @@ -1,5 +0,0 @@ -:- module(conf_owl, ). - -/** <module> Library of OWL based predicates -*/ - diff --git a/lib/semweb/owl_sameas.pl b/lib/semweb/owl_sameas.pl new file mode 100644 index 0000000..caf0de0 --- /dev/null +++ b/lib/semweb/owl_sameas.pl @@ -0,0 +1,123 @@ +/* Part of ClioPatria SeRQL and SPARQL server + + Author: Jan Wielemaker + E-mail: J.Wielemaker@cs.vu.nl + WWW: http://www.swi-prolog.org + Copyright (C): 2010, University of Amsterdam, + VU University Amsterdam + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + As a special exception, if you link this library with other files, + compiled with a Free Software compiler, to produce an executable, this + library does not by itself cause the resulting executable to be covered + by the GNU General Public License. This exception does not however + invalidate any other reasons why the executable file might be covered by + the GNU General Public License. +*/ + +:- module(owl_sameas, + [ owl_sameas/2, % ?R1, ?R2 + owl_sameas_partition/2, % +List, -PowerSet + owl_sameas_representative/3 % +Algorithm, +Set, -Representative + ]). +:- use_module(library(semweb/rdf_db)). +:- use_module(library(ordsets)). +:- use_module(library(count)). + +:- initialization + rdf_set_predicate(owl:sameAs, symmetric(true)). + +:- if((rdf_version(V),V<20900)). +:- multifile prolog:message//1. +prolog:message(rdf_version(MinVersion)) --> + [ 'library(semweb/owl_sameas) requires version > ~w of RDF-DB'- + [MinVersion] + ]. +:- print_message(error, rdf_version(20900)). +:- endif. + +/** <module> Handle owl:sameAs predicates + +This module provides predicates that perform various operations on sets +of resources that are possibly connected through owl:sameAs reations. +*/ + +%% owl_sameas(?R1, ?R2) is nondet. +% +% True if R is equivalent to R0 through owl:sameAs properties. + +owl_sameas(R1, R2) :- + rdf_reachable(R1, owl:sameAs, R2). + +%% owl_sameas_partition(+Resources, -PowerSet) is det. +% +% True when each element of PowerSet is a set of equivalent +% resources and there are no two equivalent resources in different +% members of PowerSet. + +owl_sameas_partition(Resources, PowerSet) :- + sort(Resources, OrdSet), + partition(OrdSet, PowerSet). + +partition(, ). +partition([H|T], [Set0|Sets]) :- + findall(R, owl_sameas(H, R), Eq), + sort(Eq, Set0), + ord_subtract(T, Set0, Rest), + partition(Rest, Sets). + +%% owl_sameas_representative(+Algorithm, +List, -Representer) +% +% True when Representer is a member of Set that represents the +% set. There is no unique way to decide on the representer, which +% is why we provide Algorithm to select a dedicated algorithm. The +% current implementation has two algorihtms: +% +% * order +% Return the smallest resource in the standard order of terms. +% This is adequate for internal reasoning tasks. +% * default +% Find the most-connected resource that is not a blank node. +% If all resources are blank nodes, find the most connected +% one. + +owl_sameas_representative(order, List, Representative) :- + sort(List, [Representative|_]). +owl_sameas_representative(default, List, Representative) :- + ( exclude(rdf_is_bnode, List, NonBNodes), + NonBNodes \==  + -> representative(NonBNodes, Representative) + ; representative(List, Representative) + ). + +representative([H], Representative) :- !, + Representative = H. +representative([H|T], Representative) :- + fan_in_out(H, Fan0), + best(T, Fan0, H, Representative). + +best(, _, R, R). +best([H|T], S0, R0, R) :- + fan_in_out(H, S1), + ( S1 > S0 + -> best(T, S1, H, R) + ; best(T, S0, R0, R) + ). + +fan_in_out(R, Fan) :- + proof_count(rdf(R, _, _), 100, FanOut), + proof_count(rdf(_, _, R), 100, FanIn), + Fan is FanOut + FanIn. diff --git a/rdf/cpack/owl.ttl b/rdf/cpack/owl.ttl index 941ff7f..8037825 100644 --- a/rdf/cpack/owl.ttl +++ b/rdf/cpack/owl.ttl @@ -11,7 +11,7 @@ # this. Otherwise you can specify the information inline as done below. # See http://xmlns.com/foaf/spec/ for defines fields. -<> a cpack:Package ; +<> a cpack:Library ; cpack:packageName "owl" ; dcterms:title "Library of OWL based predicates" ; cpack:author [ a foaf:Person ; @@ -24,7 +24,8 @@ ] ; cpack:description -"""The package description goes here. You can use PlDoc Wiki markup. +"""This package provides a collection of libraries to deal with OWL + related tasks, mostly reasoning with OWL-properties. """ .