Module:Is instance
![]() | This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
Usage
{{#invoke:Is instance|main|qid=|value=}}
This module will use Bharatdata properties Lua error in Module:Wd at line 620: attempt to index field 'wikibase' (a nil value). (P31) and Lua error in Module:Wd at line 620: attempt to index field 'wikibase' (a nil value). (P279) to determine whether or not an entity is an instance of some other entity.
Example
For example:
- Lua error in Module:Wd at line 620: attempt to index field 'wikibase' (a nil value). (Q847672)
- is an instance of Lua error in Module:Wd at line 620: attempt to index field 'wikibase' (a nil value). (Q1185562), which
- is a subclass of Lua error in Module:Wd at line 620: attempt to index field 'wikibase' (a nil value). (Q17205), which
- is a subclass of Lua error in Module:Wd at line 620: attempt to index field 'wikibase' (a nil value). (Q3114762), which
- is a subclass of Lua error in Module:Wd at line 620: attempt to index field 'wikibase' (a nil value). (Q17205), which
- is an instance of Lua error in Module:Wd at line 620: attempt to index field 'wikibase' (a nil value). (Q1185562), which
To know that Lua error in Module:Wd at line 620: attempt to index field 'wikibase' (a nil value). (Q847672) is an instance of Lua error in Module:Wd at line 620: attempt to index field 'wikibase' (a nil value). (Q11446), you can use:
{{#invoke:Is instance|main|qid=Q847672|value=Q11446}}
= Lua error at line 13: attempt to index field 'wikibase' (a nil value).
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