ข้ามไปเนื้อหา

มอดูล:Is instance

จากวิกิพีเดีย สารานุกรมเสรี
Documentation icon คู่มือการใช้งานมอดูล[ดู] [แก้] [ประวัติ] [ล้างแคช]

Usage[แก้]

{{#invoke:Is instance|main|qid=|value=}}

This module will use Wikidata properties เป็น (P31) and กลุ่มย่อยของ (P279) to determine whether or not an entity is an instance of some other entity.

Example[แก้]

For example:

To know that (Q847672) is an instance of เรือกำปั่น (Q11446), you can use:

{{#invoke:Is instance|main|qid=Q847672|value=Q11446}} = 3

The output number indicates the minimum recursion depth to find the value required. An output of zero indicates that the item is not an instance.

Maximum depth[แก้]

For performance considerations, the module will not go on searching indefinitely. The default maximum recursion depth is 5. If you want to change this, use the |maxdepth= parameter.

local p = {};

local function checklayer(depth) -- check subclasses of items at current depth
	checklist[depth+1] = {} -- setup next layer of table
	local j = 0
	for j = 1,#checklist[depth] do -- loop over items at current depth
		local property
		if depth == 1 then
			property = "P31" -- use P31 for depth 1
		else
			property = "P279" -- use P279 for depths 2+
		end
		local subclasses = mw.wikibase.getBestStatements(checklist[depth][j],property) -- get P31 or P279 statements
		for i,statement in ipairs(subclasses) do -- loop through items at next depth
			if statement.mainsnak.snaktype == 'value' then
				local newitem = statement.mainsnak.datavalue.value.id
				if newitem == value then
					isInstance = true
				else
					checklist[depth+1][#checklist[depth+1]+1] = newitem -- add item to next depth of checklist table
				end
			end
		end
	end
	return isInstance
end

function p.main(frame)
	local args = frame.args
	local pargs = frame:getParent().args
	value = args.value or pargs.value
	local qid = args.qid or pargs.qid or ""
	if qid == "" then
		qid = mw.wikibase.getEntityIdForCurrentPage()
	end
	if not qid then
		return 0
	end
	checklist = {{qid}}
	local md = args.maxdepth or pargs.maxdepth
	if md then
		maxdepth = tonumber(md)
	else
		maxdepth = 5
	end
	depth = 0 -- current depth
	isInstance = false -- assume false until match found
	while not isInstance and depth<maxdepth do
		depth = depth+1
		checklayer(depth)
	end
	if not isInstance then
		depth = 0 -- indicates not isInstance
	end
	return depth -- return depth that item was found
end

return p