<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://baripedia.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikidata%2FAnalyse_transitive</id>
	<title>Module:Wikidata/Analyse transitive - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://baripedia.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikidata%2FAnalyse_transitive"/>
	<link rel="alternate" type="text/html" href="https://baripedia.org/index.php?title=Module:Wikidata/Analyse_transitive&amp;action=history"/>
	<updated>2026-04-21T12:16:10Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.38.6</generator>
	<entry>
		<id>https://baripedia.org/index.php?title=Module:Wikidata/Analyse_transitive&amp;diff=30888&amp;oldid=prev</id>
		<title>Arthur : 1 révision importée</title>
		<link rel="alternate" type="text/html" href="https://baripedia.org/index.php?title=Module:Wikidata/Analyse_transitive&amp;diff=30888&amp;oldid=prev"/>
		<updated>2016-01-27T20:14:11Z</updated>

		<summary type="html">&lt;p&gt;1 révision importée&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Helpers for queries using transitive properties&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local wd = require &amp;quot;Module:Wikidata&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local function getids(item, query) &lt;br /&gt;
	query.excludespecial = true&lt;br /&gt;
	query.displayformat = 'raw'&lt;br /&gt;
	query.entity = item&lt;br /&gt;
	return wd.stringTable(query)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function alreadyHere(searchset, val)&lt;br /&gt;
	for i, j in pairs(searchset) do&lt;br /&gt;
		if val == j then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- add new items to a list, avoiding duplicates&lt;br /&gt;
local function addnewvalues(olditems, newitems, maxnum, stopval)&lt;br /&gt;
	if not newitems then&lt;br /&gt;
		return olditems&lt;br /&gt;
	end&lt;br /&gt;
	for _, qid in pairs(newitems) do&lt;br /&gt;
		if stopval and (qid == stopval) then&lt;br /&gt;
			table.insert(olditems, qid)&lt;br /&gt;
		return olditems&lt;br /&gt;
		end&lt;br /&gt;
		if maxnum and (#olditems &amp;gt;= maxnum) then&lt;br /&gt;
			return olditems&lt;br /&gt;
		end&lt;br /&gt;
		if not alreadyHere(olditems, qid) then&lt;br /&gt;
			table.insert(olditems, qid)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return olditems&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- recursively adds a list of qid to an existing list, based on the results of a query&lt;br /&gt;
function p.addVals(list, query, maxdepth, maxnodes, stopval)&lt;br /&gt;
	maxdepth = maxdepth or 10&lt;br /&gt;
	maxnodes = maxnodes or 100&lt;br /&gt;
	if (maxdepth &amp;lt; 0) then&lt;br /&gt;
		return list&lt;br /&gt;
	end&lt;br /&gt;
	if stopval and alreadyHere(list, stopval) then&lt;br /&gt;
		return list&lt;br /&gt;
	end&lt;br /&gt;
	local origsize = #list&lt;br /&gt;
	for i = 1, origsize do&lt;br /&gt;
	-- tried a  &amp;quot;checkpos&amp;quot; param instead of starting to 1 each time, but no impact on performance&lt;br /&gt;
	local candidates = getids(list[i], query)&lt;br /&gt;
	list = addnewvalues(list, candidates, maxnum, stopval)&lt;br /&gt;
	if list[#list] == stopval then&lt;br /&gt;
		return list&lt;br /&gt;
	end&lt;br /&gt;
	if #list &amp;gt;= maxnodes then&lt;br /&gt;
		return list&lt;br /&gt;
	end&lt;br /&gt;
	end&lt;br /&gt;
	if (#list == origsize) then&lt;br /&gt;
		return list&lt;br /&gt;
	end&lt;br /&gt;
	return p.addVals(list, query, maxdepth - 1, maxnodes, stopval, origsize + 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns a list of items transitively matching a query (orig item is not included in the list)&lt;br /&gt;
function p.transitiveVals(item, query, maxdepth, maxnodes, stopval)&lt;br /&gt;
	maxdepth = maxdepth or 10&lt;br /&gt;
	local vals = getids(item, query)&lt;br /&gt;
	if not vals then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
return p.addVals(vals, query, maxdepth - 1, maxnodes, stopval)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns true if an item is the value of a query, transitively&lt;br /&gt;
function p.inTransitiveVals(searchedval, sourceval, query, maxdepth, maxnodes )&lt;br /&gt;
	local vals = p.transitiveVals(sourceval, query, maxdepth, maxnodes, searchedval )&lt;br /&gt;
	if vals and vals[#vals] == searchedval then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns true if an item is a superclass of another, based on P279&lt;br /&gt;
function p.isSubclass(class, item, maxdepth)&lt;br /&gt;
	local query = {property = 'P279'}&lt;br /&gt;
	if class == item then -- item is a subclass of itself iff it is a class&lt;br /&gt;
	if getids(item, query) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
	end&lt;br /&gt;
	return p.inTransitiveVals(class, item, query, maxdepth )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns true if one of the best ranked P31 values of an item is the target or a subclass of the target&lt;br /&gt;
-- rank = 'valid' would seem to make sense, but it would need to check for date qualifiers as some P31 values have begin or end date&lt;br /&gt;
function p.isInstance(targetclass, item, maxdepth)&lt;br /&gt;
	maxdepth = maxdepth or 10&lt;br /&gt;
	local directclasses = p.transitiveVals(item, {property = 'P31'}, 1)&lt;br /&gt;
	if not directclasses then&lt;br /&gt;
	return false&lt;br /&gt;
	end&lt;br /&gt;
	for i, class in pairs(directclasses) do&lt;br /&gt;
		if p.isSubclass(targetclass, class, maxdepth - 1) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Arthur</name></author>
	</entry>
	<entry>
		<id>https://baripedia.org/index.php?title=Module:Wikidata/Analyse_transitive&amp;diff=28305&amp;oldid=prev</id>
		<title>Arthur : 1 révision importée</title>
		<link rel="alternate" type="text/html" href="https://baripedia.org/index.php?title=Module:Wikidata/Analyse_transitive&amp;diff=28305&amp;oldid=prev"/>
		<updated>2015-11-09T20:49:24Z</updated>

		<summary type="html">&lt;p&gt;1 révision importée&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Helpers for queries using transitive properties&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local wd = require &amp;quot;Module:Wikidata&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local function getids(item, query) &lt;br /&gt;
	query.excludespecial = true&lt;br /&gt;
	query.displayformat = 'raw'&lt;br /&gt;
	query.entity = item&lt;br /&gt;
	return wd.stringTable(query)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function alreadyHere(searchset, val)&lt;br /&gt;
	for i, j in pairs(searchset) do&lt;br /&gt;
		if val == j then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- add new items to a list, avoiding duplicates&lt;br /&gt;
local function addnewvalues(olditems, newitems, maxnum, stopval)&lt;br /&gt;
	if not newitems then&lt;br /&gt;
		return olditems&lt;br /&gt;
	end&lt;br /&gt;
	for _, qid in pairs(newitems) do&lt;br /&gt;
		if stopval and (qid == stopval) then&lt;br /&gt;
			table.insert(olditems, qid)&lt;br /&gt;
		return olditems&lt;br /&gt;
		end&lt;br /&gt;
		if maxnum and (#olditems &amp;gt;= maxnum) then&lt;br /&gt;
			return olditems&lt;br /&gt;
		end&lt;br /&gt;
		if not alreadyHere(olditems, qid) then&lt;br /&gt;
			table.insert(olditems, qid)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return olditems&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- recursively adds a list of qid to an existing list, based on the results of a query&lt;br /&gt;
function p.addVals(list, query, maxdepth, maxnodes, stopval)&lt;br /&gt;
	maxdepth = maxdepth or 10&lt;br /&gt;
	maxnodes = maxnodes or 100&lt;br /&gt;
	if (maxdepth &amp;lt; 0) then&lt;br /&gt;
		return list&lt;br /&gt;
	end&lt;br /&gt;
	if stopval and alreadyHere(list, stopval) then&lt;br /&gt;
		return list&lt;br /&gt;
	end&lt;br /&gt;
	local origsize = #list&lt;br /&gt;
	for i = 1, origsize do&lt;br /&gt;
	-- tried a  &amp;quot;checkpos&amp;quot; param instead of starting to 1 each time, but no impact on performance&lt;br /&gt;
	local candidates = getids(list[i], query)&lt;br /&gt;
	list = addnewvalues(list, candidates, maxnum, stopval)&lt;br /&gt;
	if list[#list] == stopval then&lt;br /&gt;
		return list&lt;br /&gt;
	end&lt;br /&gt;
	if #list &amp;gt;= maxnodes then&lt;br /&gt;
		return list&lt;br /&gt;
	end&lt;br /&gt;
	end&lt;br /&gt;
	if (#list == origsize) then&lt;br /&gt;
		return list&lt;br /&gt;
	end&lt;br /&gt;
	return p.addVals(list, query, maxdepth - 1, maxnodes, stopval, origsize + 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns a list of items transitively matching a query (orig item is not included in the list)&lt;br /&gt;
function p.transitiveVals(item, query, maxdepth, maxnodes, stopval)&lt;br /&gt;
	maxdepth = maxdepth or 10&lt;br /&gt;
	local vals = getids(item, query)&lt;br /&gt;
	if not vals then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
return p.addVals(vals, query, maxdepth - 1, maxnodes, stopval)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns true if an item is the value of a query, transitively&lt;br /&gt;
function p.inTransitiveVals(searchedval, sourceval, query, maxdepth, maxnodes )&lt;br /&gt;
	local vals = p.transitiveVals(sourceval, query, maxdepth, maxnodes, searchedval )&lt;br /&gt;
	if vals and vals[#vals] == searchedval then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns true if an item is a superclass of another, based on P279&lt;br /&gt;
function p.isSubclass(class, item, maxdepth)&lt;br /&gt;
	local query = {property = 'P279'}&lt;br /&gt;
	if class == item then -- item is a subclass of itself iff it is a class&lt;br /&gt;
	if getids(item, query) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
	end&lt;br /&gt;
	return p.inTransitiveVals(class, item, query, maxdepth )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns true if one of the best ranked P31 values of an item is the target or a subclass of the target&lt;br /&gt;
-- rank = 'valid' would seem to make sense, but it would need to check for date qualifiers as some P31 values have begin or end date&lt;br /&gt;
function p.isInstance(targetclass, item, maxdepth)&lt;br /&gt;
	maxdepth = maxdepth or 10&lt;br /&gt;
	local directclasses = p.transitiveVals(item, {property = 'P31'}, 1)&lt;br /&gt;
	if not directclasses then&lt;br /&gt;
	return false&lt;br /&gt;
	end&lt;br /&gt;
	for i, class in pairs(directclasses) do&lt;br /&gt;
		if p.isSubclass(targetclass, class, maxdepth - 1) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Arthur</name></author>
	</entry>
</feed>