<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ar">
	<id>https://3rabica.org/index.php?action=history&amp;feed=atom&amp;title=%D9%88%D8%AD%D8%AF%D8%A9%3AWikidata%2FAnalyse_transitive</id>
	<title>وحدة:Wikidata/Analyse transitive - تاريخ المراجعة</title>
	<link rel="self" type="application/atom+xml" href="https://3rabica.org/index.php?action=history&amp;feed=atom&amp;title=%D9%88%D8%AD%D8%AF%D8%A9%3AWikidata%2FAnalyse_transitive"/>
	<link rel="alternate" type="text/html" href="https://3rabica.org/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:Wikidata/Analyse_transitive&amp;action=history"/>
	<updated>2026-06-05T09:31:46Z</updated>
	<subtitle>تاريخ التعديل لهذه الصفحة في الويكي</subtitle>
	<generator>MediaWiki 1.43.7</generator>
	<entry>
		<id>https://3rabica.org/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:Wikidata/Analyse_transitive&amp;diff=343&amp;oldid=prev</id>
		<title>عبد العزيز: أنشأ الصفحة ب&#039;-- Helpers for queries using transitive properties  local p = {} local wd = require &quot;Module:Wikidata&quot;  local function getids(item, query)  	query.excludespecial = true...&#039;</title>
		<link rel="alternate" type="text/html" href="https://3rabica.org/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:Wikidata/Analyse_transitive&amp;diff=343&amp;oldid=prev"/>
		<updated>2016-04-01T16:52:22Z</updated>

		<summary type="html">&lt;p&gt;أنشأ الصفحة ب&amp;#039;-- Helpers for queries using transitive properties  local p = {} local wd = require &amp;quot;Module:Wikidata&amp;quot;  local function getids(item, query)  	query.excludespecial = true...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;صفحة جديدة&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 = &amp;#039;raw&amp;#039;&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 = &amp;#039;P279&amp;#039;}&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 = &amp;#039;valid&amp;#039; 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 = &amp;#039;P31&amp;#039;}, 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>عبد العزيز</name></author>
	</entry>
</feed>