amalgame/commit

IMPROVED: handle derived concept schemes

authorJacco van Ossenbruggen
Wed Feb 19 17:58:33 2020 +0100
committerJacco van Ossenbruggen
Wed Feb 19 17:58:33 2020 +0100
commit4ec400d8ed37777511f7623168b87073590aa483
treebb278ba0fb54428ab80c8e4d36763a9138584946
parentf68378d44ea520a36a3f1163f0204a2b1fcff120
Diff style: patch stat
diff --git a/api/node_info.pl b/api/node_info.pl
index 8cc8ae1..1a9783e 100644
--- a/api/node_info.pl
+++ b/api/node_info.pl
@@ -18,6 +18,7 @@
 :- use_module(library(amalgame/amalgame_modules)).
 :- use_module(library(amalgame/ag_strategy)).
 :- use_module(library(amalgame/ag_stats)).
+:- use_module(library(amalgame/vocabulary)).
 :- use_module(library(amalgame/util)).
 :- use_module(components(label)). % we need rdf_link//1 from this module
 
@@ -202,7 +203,7 @@ amalgame_info(URL, Strategy, Stats) :-
 	], Stats).
 
 amalgame_info(Scheme, Strategy, Stats) :-
-	skos_is_vocabulary(Scheme),
+	amalgame_alignable_scheme(Scheme),
 	!,
 	node_stats(Strategy, Scheme, NStats, []),
 	option(structure(DDict), NStats, _{}),
diff --git a/api/strategy_viz.pl b/api/strategy_viz.pl
index 113129d..bf78438 100644
--- a/api/strategy_viz.pl
+++ b/api/strategy_viz.pl
@@ -15,6 +15,7 @@
 :- use_module(library(amalgame/ag_stats)).
 :- use_module(library(amalgame/ag_evaluation)).
 :- use_module(library(amalgame/map)).
+:- use_module(library(amalgame/vocabulary)).
 
 :- http_handler(amalgame(api/strategy_viz), http_strategy_viz, []).
 
@@ -171,7 +172,7 @@ amalgame_shape(R, [shape(ellipse),
 	      fillcolor('#EEEEEE'),
 	      fontsize(10)]) :-
 	atom(R),
-	skos_is_vocabulary(R).
+	amalgame_alignable_scheme(R).
 amalgame_shape(R, [shape(ellipse),
 	      fillcolor(Color),
 	      style(filled),
@@ -224,7 +225,7 @@ amalgame_label(Strategy, Resource, Lang, MaxLen, Label) :-
 	).
 
 stats_label_list(Strategy, Resource, [Count]) :-
-	skos_is_vocabulary(Resource),
+	amalgame_alignable_scheme(Resource),
 	node_stats(Strategy, Resource, Stats, [compute(false)]),
 	option(totalCount(Count), Stats),
 	!.
diff --git a/config-available/ag_strat_prov_graph_viz.pl b/config-available/ag_strat_prov_graph_viz.pl
index 8183c0c..7fb34e5 100644
--- a/config-available/ag_strat_prov_graph_viz.pl
+++ b/config-available/ag_strat_prov_graph_viz.pl
@@ -6,7 +6,7 @@
 :- use_module(library(semweb/rdfs)).
 :- use_module(library(semweb/rdf_abstract)).
 
-:- use_module(library(skos/util)).
+:- use_module(library(amalgame/vocabulary)).
 
 :- rdf_meta
         context_triple(r, t),
@@ -16,7 +16,7 @@ cliopatria:context_graph(URI, RDF) :-
 	(   rdfs_individual_of(URI, prov:'Entity')
 	;   rdfs_individual_of(URI, prov:'Activity')
 	;   rdfs_individual_of(URI, prov:'Agent')
-	;   skos_is_vocabulary(URI)
+	;   amalgame_alignable_scheme(URI)
 	;   rdfs_individual_of(URI, amalgame:'Entity')
 	),
 	findall(T, prov_context_triple(URI, T), RDF0),
@@ -115,5 +115,5 @@ cliopatria:node_shape(URI, Shape, _Options) :-
 
 % Vocabulary (up)loaded or made with amalgame
 cliopatria:node_shape(URI, Shape, _Options) :-
-	skos_is_vocabulary(URI),
+	amalgame_alignable_scheme(URI),
 	Shape = [shape(box3d),style(filled),fillcolor('#AAAAAA')].
diff --git a/lib/amalgame/ag_provenance.pl b/lib/amalgame/ag_provenance.pl
index 6117265..d95405e 100644
--- a/lib/amalgame/ag_provenance.pl
+++ b/lib/amalgame/ag_provenance.pl
@@ -20,9 +20,7 @@
 
 :- use_module(user(user_db)).
 :- use_module(library(version)).
-:- use_module(library(prov_schema)).
-:- use_module(library(skos/util)).
-
+:- use_module(vocabulary).
 :- use_module(ag_stats).
 :- use_module(util).
 
@@ -80,7 +78,7 @@ prov_ensure_entity(_S, Entity, Graph) :-
 	rdf(Entity, 'http://usefulinc.com/ns/doap#revision' , _, Graph),
 	!. % prov already recorded
 prov_ensure_entity(Strategy, Entity, Graph) :-
-	skos_is_vocabulary(Entity),
+	amalgame_alignable_scheme(Entity),
 	node_stats(Strategy, Entity, Stats, []),
 	option(revision(Revision), Stats),
 	prov_named_graphs(Repo, Graph),
@@ -389,7 +387,7 @@ assert_counts([URI|Tail], Strategy, ProvGraph) :-
 	assert_counts(Tail, Strategy, ProvGraph).
 
 assert_count(VocUri, Strategy, ProvGraph) :-
-	skos_is_vocabulary(VocUri),
+	amalgame_alignable_scheme(VocUri),
 	node_stats(Strategy, VocUri, Stats, []),
 	option(totalCount(Count), Stats),
 	rdf_retractall(VocUri, amalgame:totalCount, _, ProvGraph),
diff --git a/lib/amalgame/ag_publish.pl b/lib/amalgame/ag_publish.pl
index 10f9d8a..473380d 100644
--- a/lib/amalgame/ag_publish.pl
+++ b/lib/amalgame/ag_publish.pl
@@ -12,8 +12,6 @@
 :- use_module(library(semweb/rdf_label)).
 :- use_module(library(semweb/rdf_turtle_write)).
 
-:- use_module(library(skos/util)).
-
 :- use_module(library(amalgame/ag_provenance)).
 :- use_module(library(amalgame/ag_evaluation)).
 :- use_module(library(amalgame/ag_stats)).
@@ -287,14 +285,14 @@ select_schemes_to_be_saved(Strategy, Schemes, Options) :-
 	option(status(Status), Options, all),
 	(   Status == all
 	->  findall(Scheme,
-		    (	skos_is_vocabulary(Scheme),
+		    (	amalgame_alignable_scheme(Scheme),
 			rdf(Scheme, rdf:type, _, Strategy),
 			node_stats(Strategy, Scheme, Stats, [compute(true)]),
 			\+ option(totalCount(0), Stats)
 		    ),
 		    Schemes)
 	;   findall(Scheme,
-		    (	skos_is_vocabulary(Scheme),
+		    (	amalgame_alignable_scheme(Scheme),
 			rdf(Scheme, rdf:type, _, Strategy),
 			rdf(Scheme, amalgame:status, Status),
 			node_stats(Strategy, Scheme, Stats, [compute(true)]),
diff --git a/lib/amalgame/ag_stats.pl b/lib/amalgame/ag_stats.pl
index dd1fea0..e29c006 100644
--- a/lib/amalgame/ag_stats.pl
+++ b/lib/amalgame/ag_stats.pl
@@ -12,7 +12,6 @@
 :- use_module(library(semweb/rdf_db)).
 :- use_module(library(semweb/rdfs)).
 
-:- use_module(library(skos/util)).
 :- use_module(library(stat_lists)).
 
 :- use_module(library(amalgame/ag_strategy)).
@@ -30,7 +29,7 @@ node_stats(Strategy, Node, Stats, Options) :-
 	!,
 	(   rdfs_individual_of(Node, amalgame:'Mapping')
 	->  node_counts(mapping, Node, Strategy, Stats, Options)
-	;   skos_is_vocabulary(Node)
+	;   amalgame_alignable_scheme(Node)
 	->  node_counts(scheme, Node, Strategy, Stats, Options)
 	;   Stats = []
 	).
diff --git a/lib/amalgame/caching.pl b/lib/amalgame/caching.pl
index f3120ba..34f509f 100644
--- a/lib/amalgame/caching.pl
+++ b/lib/amalgame/caching.pl
@@ -22,10 +22,9 @@
 :- use_module(library(semweb/rdf_db)).
 :- use_module(library(semweb/rdfs)).
 
-:- use_module(library(skos/util)).
-
 :- use_module(ag_provenance).
 :- use_module(map).
+:- use_module(vocabulary).
 :- use_module(ag_stats).
 :- use_module(scheme_stats).
 
@@ -89,7 +88,7 @@ cache_result(_ExecTime, Id, Strategy, Result) :-
 	assert(stats_cache(Id-Strategy, Stats)).
 
 cache_result(_ExecTime, Id, Strategy, Result) :-
-	skos_is_vocabulary(Id),
+	amalgame_alignable_scheme(Id),
 	!,
 	flush_expand_cache(Id, Strategy),
 	assert(expand_cache(Id-Strategy, Result)),
@@ -346,7 +345,7 @@ mapping_to_delete(Id, Strategy) :-
 
 del_materialized_vocs(Strategy) :-
 	findall(Voc,
-		(   skos_is_vocabulary(Voc),
+		(   amalgame_alignable_scheme(Voc),
 		    rdf_graph(Voc),
 		    rdf_has(Voc, amalgame:wasGeneratedBy, Process, RP),
 		    rdf(Voc, RP, Process, Strategy)
diff --git a/lib/amalgame/expand_graph.pl b/lib/amalgame/expand_graph.pl
index d66978c..ca67e87 100644
--- a/lib/amalgame/expand_graph.pl
+++ b/lib/amalgame/expand_graph.pl
@@ -17,6 +17,7 @@
 
 :- use_module(library(amalgame/caching)).
 :- use_module(library(amalgame/map)).
+:- use_module(library(amalgame/vocabulary)).
 :- use_module(library(amalgame/ag_provenance)).
 :- use_module(library(amalgame/amalgame_modules)).
 
@@ -113,7 +114,7 @@ expand_node_(Strategy, Id, Result) :-
 
 	(   rdfs_individual_of(Id, amalgame:'Mapping')
 	->  select_result_mapping(Id, ProcessResult, OutputType, Result)
-	;   skos_is_vocabulary(Id)
+	;   amalgame_alignable_scheme(Id)
 	->  select_result_scheme(Id, ProcessResult, OutputType, Result)
 	;   Result = error(Id)
 	).
@@ -123,7 +124,7 @@ expand_node_(Strategy, Id, Result) :-
 	% Cache miss, we need to do the work ...
 	(   rdfs_individual_of(Id, amalgame:'Mapping')
 	->  expand_mapping(Strategy, Id, Result)
-	;   skos_is_vocabulary(Id)
+	;   amalgame_alignable_scheme(Id)
 	->  expand_vocab(Strategy, Id, Result)
 	;   Result=error(Id)
 	).
diff --git a/lib/amalgame/vocabulary.pl b/lib/amalgame/vocabulary.pl
index cf27a23..34aba40 100644
--- a/lib/amalgame/vocabulary.pl
+++ b/lib/amalgame/vocabulary.pl
@@ -2,6 +2,7 @@
 	  [ vocab_member/2,
 	    all_vocab_members/2,
 	    amalgame_alignable_schemes/1,
+	    amalgame_alignable_scheme/1,
 	    amalgame_vocabulary_languages/1,
 	    materialize_scheme_graph/2
 	  ]).
@@ -29,7 +30,7 @@
 %
 %	True if C is part of Vocabulary.
 %
-%	@param VocabDef is a URI of a skos:ConceptScheme or a definition
+%	@param VocabDef is a URI of a skos:ConceptScheme or a definitionamlgame_alignable_schemeamlgame_alignable_schemeamlgame_alignable_scheme
 %	of a subset thereof.
 
 vocab_member(C, vocspec(Spec)) :-
@@ -211,29 +212,49 @@ materialize_scheme_graph(Assoc, Options) :-
 materialize_concept(Concept, Graph) :-
 	rdf_assert(Concept, skos:inScheme, Graph, Graph).
 
+%!	amalgame_alignable_scheme(Scheme) is nondet.
+%
+%	Scheme is unified with a derived (implicitly) defined
+%	skos:ConceptScheme or an explicitly defined, non-empty
+%	skos:ConceptScheme.
+
+amalgame_alignable_scheme(S) :-
+	explicit_non_empty_scheme(S).
+
+amalgame_alignable_scheme(S) :-
+	derived_scheme(S).
+
 
 %%	amalgame_alignable_schemes(-Schemes) is det.
 %
 %	Schemes is unified with a sorted list of urls of
-%	skos:ConceptSchemes or other alignable objects.
+%       alignable objects.
 %
 %	Sorting is based on case insensitive scheme labels.
 
 amalgame_alignable_schemes(Schemes) :-
-	findall(S, alignable_scheme(S), All),
+	findall(S, amalgame_alignable_scheme(S), All0),
+	sort(All0, All),
 	maplist(scheme_label, All, Labeled),
 	keysort(Labeled, Sorted),
 	pairs_values(Sorted, Schemes).
 
-alignable_scheme(S) :-
+derived_scheme(Scheme) :-
+	skos_in_scheme(Scheme, _Concept),
+	\+ skos_is_vocabulary(Scheme).
+
+explicit_non_empty_scheme(S) :-
         skos_is_vocabulary(S),
 	skos_in_scheme_chk(S, _).
+
 skos_in_scheme_chk(Scheme, Concept) :-
 	skos_in_scheme(Scheme, Concept), !.
 scheme_label(URI, Key-URI) :-
 	rdf_graph_label(URI, CasedKey),
 	downcase_atom(CasedKey, Key).
 
+
+
 amalgame_vocabulary_languages(Languages) :-
 	findall(Strategy-Schemes,
 		strategy_vocabularies(Strategy, Schemes),