<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://www.wikonsult.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://www.wikonsult.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikidata%2FAnalyse_transitive"/>
	<link rel="alternate" type="text/html" href="https://www.wikonsult.org/index.php?title=Module:Wikidata/Analyse_transitive&amp;action=history"/>
	<updated>2026-08-11T20:43:19Z</updated>
	<subtitle>Historique des révisions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>https://www.wikonsult.org/index.php?title=Module:Wikidata/Analyse_transitive&amp;diff=169&amp;oldid=prev</id>
		<title>Yves.bertin : 1 révision importée</title>
		<link rel="alternate" type="text/html" href="https://www.wikonsult.org/index.php?title=Module:Wikidata/Analyse_transitive&amp;diff=169&amp;oldid=prev"/>
		<updated>2019-02-24T14:17:52Z</updated>

		<summary type="html">&lt;p&gt;1 révision importée&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fr&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Version précédente&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Version du 24 février 2019 à 14:17&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;fr&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Aucune différence)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yves.bertin</name></author>
		
	</entry>
	<entry>
		<id>https://www.wikonsult.org/index.php?title=Module:Wikidata/Analyse_transitive&amp;diff=168&amp;oldid=prev</id>
		<title>w.fr&gt;Zolo le 11 juin 2017 à 08:33</title>
		<link rel="alternate" type="text/html" href="https://www.wikonsult.org/index.php?title=Module:Wikidata/Analyse_transitive&amp;diff=168&amp;oldid=prev"/>
		<updated>2017-06-11T08:33:12Z</updated>

		<summary type="html">&lt;p&gt;&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;
local tools = require &amp;quot;Module:Wikidata/Outils&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;
&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 tools.isHere(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 = tonumber(maxdepth) or 10&lt;br /&gt;
	maxnodes = tonumber(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 tools.isHere(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, maxnodes, 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, astring)&lt;br /&gt;
&lt;br /&gt;
	maxdepth = tonumber(maxdepth) or 5&lt;br /&gt;
	if type(query) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		query = {property = query}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- récupération des valeurs&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;
	local v = p.addVals(vals, query, maxdepth - 1, maxnodes, stopval) &lt;br /&gt;
	if not v then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- réarrangement des valeurs&lt;br /&gt;
	if query.valorder == &amp;quot;inverted&amp;quot; then&lt;br /&gt;
		local a = {}&lt;br /&gt;
		for i, j in pairs(v) do&lt;br /&gt;
			table.insert(a, 1, j)&lt;br /&gt;
		end&lt;br /&gt;
		v = a&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- mise en forme&lt;br /&gt;
 	-- soit sous forme de chaîne&lt;br /&gt;
	if astring and (astring ~= &amp;quot;-&amp;quot;) then&lt;br /&gt;
		for i, j in pairs(v) do&lt;br /&gt;
			v[i] = wd.formatEntity(j)&lt;br /&gt;
-- il faudrait avoir les optins de mise en forme  wd.formatEntity(j, query) mais getids ajoute displayformat = &amp;quot;raw&amp;quot;, il faudrait faire d'abord une copie de la table query&lt;br /&gt;
		end&lt;br /&gt;
		return wd.tableToText(v, query)&lt;br /&gt;
	end&lt;br /&gt;
	--- soit sous forme de table&lt;br /&gt;
	return v&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 (not vals) then &lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for _, val in ipairs(vals) do&lt;br /&gt;
		if (val == searchedval) 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;
-- 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 the first value in a transitive query that belongs to a particular class. For instance find a value of P131 that is a province of Canada&lt;br /&gt;
function p.findVal(sourceitem, targetclass, query, recursion, instancedepth)&lt;br /&gt;
	if type(query) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		query = {property = query}&lt;br /&gt;
	end&lt;br /&gt;
	local candidates = getids(sourceitem, query)&lt;br /&gt;
	if candidates then&lt;br /&gt;
		for i, j in pairs(candidates) do&lt;br /&gt;
			if p.isInstance(targetclass, j,  instancedepth) then&lt;br /&gt;
				return j&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if not recursion then&lt;br /&gt;
			recursion = 3&lt;br /&gt;
		else&lt;br /&gt;
			recursion = recursion - 1&lt;br /&gt;
		end&lt;br /&gt;
		if recursion &amp;lt; 0 then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for i, candidate in pairs(candidates) do&lt;br /&gt;
			return p.findVal(candidate, targetclass, query, recursion, instancedepth)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>w.fr&gt;Zolo</name></author>
		
	</entry>
</feed>