Dokumentation für das Modul Wikidata utilities[Ansicht] [Bearbeiten] [Versionsgeschichte] [Aktualisieren]

Funktionen zur Vereinfachung des Zugriffs auf Daten aus Wikidata.

Versionsbezeichnung auf Wikidata: 2025-03-16 Ok!

Verwendung in anderen Modulen

Dieses Modul ist notwendig für die Ausführung folgender Module. Bei Anpassungen sollte die Funktionstüchtigkeit der folgenden Module geprüft werden. Benutze dazu auch diese Tracking-Kategorie um Fehler zu finden, die sich dann auf Artikel auswirken:

Interne Variable

local catTable 
  • In der Tabelle werden die verwendeten Wikidata-Eigenschaften (Properties) gespeichert.

Funktionen

  • Parameter
    • anEntity Wikidata Entity Object (table) oder Wikidata Id (string).
    • id Wikidata Id (Q...) string.
    • p Wikidata Property (P...) string.
    • count Maximalanzahl der gelieferten Werte. Bei count = nil werden alle Werte zurückgeliefert.
function wu.getEntity( id ) 
  • liefert id, entity, wrongQualifier. Prüft eine Qualifier-Id auf Vorhandensein in Wikidata. wrongQualifier nennt mit true oder false das Ergebnis. Im Erfolgsfall wird zudem ein entity-Objekt zurückgeliefert.
function wu.getEntityId( id ) 
  • liefert id, entity, wrongQualifier. Prüft eine Qualifier-Id auf Vorhandensein in Wikidata. wrongQualifier nennt mit true oder false das Ergebnis. Im Erfolgsfall wird zudem die entity-Id zurückgeliefert.
function wu.getLabel( entity, lang, noFallback ) 
  • Liefert das Label der Entity oder Qualifier-Id in der optionalen Sprache lang oder in der Inhaltssprache des Wikis zurück. Wenn noFallback auf true gesetzt wurde, wird das Label ausschließlich in der angegebenen Sprache zurückgegeben.
function wu.getAliases( entity, lang ) 
  • Liefert eine Tabelle mit Aliasen zur Wikidata-Entität entity. Wenn keine Aliase vorliegen, ist die Tabelle leer. Eine fehlende Sprache wird durch die Sprache des Wikis ersetzt.
function wu.getSitelink( entity, globalSiteId ) 
  • Liefert den Site-Link für das angegebene Wiki globalSiteId (z. B. enwiki, dewikivoyage).
function wu.getCheckedSitelink( entity, globalSiteId ) 
  • Liefert den Site-Link für das angegebene Wiki globalSiteId (z. B. enwiki, dewikivoyage) und als zweiten Wert, ob es sich dabei um einen Redirect (true) handelt oder nicht (false).
function wu.getFilteredSitelink( entity, globalSiteId ) 
  • Liefert den Site-Link für das angegebene Wiki globalSiteId (z. B. enwiki, dewikivoyage), aber nur, wenn dies kein Link zu einem Redirect ist, ansonsten nil.
function wu.getValue( entity, p ) 
  • Liefert den ersten Wert als Zeichenkette oder Tabelle, im Fehlerfall eine leere Zeichenkette.
function wu.getId( entity, p ) 
  • Liefert die erste Id als Zeichenkette, im Fehlerfall eine leere Zeichenkette.
function wu.getValues( entity, p, count ) 
  • Liefert maximal die ersten count Werte als Tabelle zurück, im Fehlerfall die leere Tabelle {}.
function wu.getIds( entity, p, count ) 
  • Liefert maximal die ersten count Ids als Tabelle zurück, im Fehlerfall die leere Tabelle {}.
function wu.getValuesByLang( entity, p, count, lang ) 
  • Liefert maximal die ersten count Werte als Tabelle zurück, bei denen die Sprache lang gesetzt ist. Im Fehlerfall die leere Tabelle {}. Die Eigenschaft p muss vom Typ monolingual text sein.
function wu.getMonolingualValues( entity, p ) 
  • Liefert eine Tabelle aller Werte als indizierte Tabelle zurück, im Fehlerfall die leere Tabelle {}. Als Index wird die Sprachbezeichnung benutzt. Es wird der jeweils erste Wert zu einem bestimmten Sprache geliefert.
  • Beispiel:
wu.getMonolingualValues( 'Q47429618', 'P6375' ) 
table#1 {  ["ar"] = "٢ شارع قصر النيل ، ميدان التحرير ، القاهرة",  ["en"] = "2 Kasr El Nil St., El Tahrir Sq., Cairo", }
function wu.getValuesByQualifier( entity, p, qualifierP, defaultId ) 
  • Liefert eine Tabelle aller Werte als indizierte Tabelle zurück, im Fehlerfall die leere Tabelle {}. qualifierP ist eine Wikidata Property (P..., string) vom Typ Datenobjekt. Die Datenobjekt-Id stellt den Index in der Tabelle für den zugehörenden Wert dar. Falls keine Datenobjekt-Id gefunden wurde, wird, falls vorhanden, defaultId benutzt bzw. der Index 'unknown' benutzt. Es wird der jeweils erste Wert zu einem bestimmten Index geliefert.
  • Beispiel:
wu.getValuesByQualifier( 'Q47429618', 'P856', 'P407' ) 
table#1 {   ["Q1860"] = "https://www.steigenberger.com/en/hotels/all-hotels/egypt/cairo/steigenberger-el-tahrir-cairo",   ["Q188"] = "https://www.steigenberger.com/hotels/alle-hotels/aegypten/kairo/steigenberger-el-tahrir-cairo", }
function wu.getValuesWithQualifiers( entity, p, values, qualifiers, references, count, labelFct, ... ) 
  • Liefert eine Tabelle, die für jedes Statement eine Tabelle mit dem Wert und den Qualifikatoren enthält.
    • values Tabelle gewünschter Werte oder nil für alle.
    • qualifiers kann nil für alle möglichen Qualifikatoren-Eigenschaften, eine Zeichenkete für eine einzelne Qualifikator-Eigenschaft oder eine Tabelle gewünschter Qualifikatoren-Eigenschaften sein. Es werden maximal die ersten count Statements zurückgeliefert.
    • references Tabelle gewünschter Eigenschaften oder nil für alle.
  • Die Funktion labelFct überführt einen Qualifier-Id in sein Label. ... sind zusätzliche Parameter für diese Funktion, die nach der Q-Id an die Funktion übergeben werden.
  • Beispiel 1:
wu.getValuesWithQualifiers( 'Q183', 'P85' ) 
table#1 {   table#2 {     ["P51"] = table#3 {       "National anthem of Germany - U.S. Army 1st Armored Division Band.ogg",     },     ["P51-type"] = "string",     ["P805"] = table#4 {       "Q4122341",     },     ["P805-type"] = "wikibase-entityid",     ["sort1"] = 1,     ["sort2"] = 1,     ["value"] = "Q44042",     ["value-type"] = "wikibase-entityid",   }, }
  • Beispiel 2:
wu.getValuesWithQualifiers( 'Q183', 'P85', nil, nil, nil, nil, wu.getLabel, 'en' ) 
table#1 {   table#2 {     ["P51"] = table#3 {       "National anthem of Germany - U.S. Army 1st Armored Division Band.ogg",     },     ["P51-type"] = "string",     ["P805"] = table#4 {       "National Anthem of Germany",     },     ["P805-type"] = "wikibase-entityid",     ["sort1"] = 1,     ["sort2"] = 1,     ["value"] = "Das Lied der Deutschen",     ["value-type"] = "wikibase-entityid",   }, }
function wu.getDateFromTime( t ) 
  • Liefert das Datum in der Form YYYY-MM-DD aus einer Zeitangabe zurück. Die Zeitangabe t muss mit einem führenden +/- beginnen. Danach folgt die Zeitangabe im ISO-Format.
  • Beispiel:
wu.getDateFromTime( '+1949-05-29T00:00:00Z' ) 
1949-05-29
function wu.getLastedit( lastEdit, statements ) 
  • Liefert das aktualisierte Datum der letzten Änderung aus dem Abrufdaten (P813) der Fundstellen.
function wu.getCategories( formatStr ) 
  • Liefert eine Zeichenkette mit den Kategorie-Links aller verwendeten Wikidata-Eigenschaften zurück.
Hinweise
-- Wikidata convenience utilities  -- documentation local WikidataUtilities = { 	suite  = 'WikidataUtilities', 	serial = '2025-03-16', 	item   = 65439025 }  -- i18n local wd = { 	version   = 'P348', 	startTime = "P580", 	endTime   = "P582", 	retrieved = 'P813',  	gregorianCalendar = { -- calendar models 		Q12138   = 1, -- Gregorian 		Q1985727 = 1  -- proleptic Gregorian 	},  	redirectBadges = { 		Q70894304 = 1, -- intentional sitelink 		Q70893996 = 1  -- redirect sitelink 	} }  -- module variable and administration local wu = { 	moduleInterface = WikidataUtilities, 	currentTime = '' }  -- table storing property ids used local catTable = { 	P0 = '' }  local function isSet( arg ) 	return arg and arg ~= '' end  function wu.getEntity( id ) 	local wrongQualifier = false 	local entity 	 	if not isSet( id ) then 		return '', entity, wrongQualifier 	end 	if mw.wikibase.isValidEntityId( id ) then 		-- expensive function call 		-- redirect ids marked false, too 		entity = mw.wikibase.getEntity( id ) 	end 	if not entity then 		id = '' 		wrongQualifier = true 	end  	return id, entity, wrongQualifier end  function wu.getEntityId( id ) 	local wrongQualifier = false 	local entity 	 	if not isSet( id ) then 		id = '' 	elseif mw.wikibase.isValidEntityId( id ) and mw.wikibase.entityExists( id ) then 		-- expensive function call 		-- redirect ids marked false, too 		entity = id 	else 		id = '' 		wrongQualifier = true 	end  	return id, entity, wrongQualifier end  function wu.getLabel( entity, lang, noFallback ) 	if not isSet( entity ) then 		return nil 	end 	local tp = type( entity ) 	if tp == 'string' and mw.wikibase.isValidEntityId( entity ) then 		return isSet( lang ) and mw.wikibase.getLabelByLang( entity, lang ) 			or ( not noFallback and mw.wikibase.getLabel( entity ) ) 	elseif tp == 'table' and entity.labels then -- really a wikidata entity? 		return isSet( lang ) and entity:getLabel( lang ) 			or ( not noFallback and entity:getLabel() ) 	end 	return nil end  function wu.getAliases( entity, lang ) 	if type( entity ) == 'string' then -- is Q id 		entity = mw.wikibase.getEntity( entity ) 	end 	if not lang then 		lang = mw.getContentLanguage():getCode() 	end 	local aliases = {} 	if entity and entity.aliases and entity.aliases[ lang ] then 		for i, alias in ipairs( entity.aliases[ lang ] ) do 			table.insert( aliases, alias.value ) 		end 	end 	return aliases end  function wu.getSitelink( entity, globalSiteId ) 	if not isSet( entity ) then 		return nil 	end 	if type( entity ) == 'string' then -- entity is id 		return mw.wikibase.getSitelink( entity, globalSiteId ) 	elseif entity and entity.labels then 		return entity:getSitelink( globalSiteId ) 	end 	return nil end  local function getSitelinkTable( entity, globalSiteId ) 	if not isSet( entity ) or not isSet( globalSiteId ) then 		return nil 	elseif type( entity ) == 'string' then -- entity is id 		entity = mw.wikibase.getEntity( entity ) 	end 	if entity and entity.sitelinks then 		return entity.sitelinks[ globalSiteId ] 	end 	return nil end  -- getting sitelink title marking as redirect function wu.getCheckedSitelink( entity, globalSiteId ) 	local isRedirect = false 	local t = getSitelinkTable( entity, globalSiteId ) 	if not t or not t.title then 		return nil, isRedirect 	end 	for i = 1, #t.badges do 		if wd.redirectBadges[ t.badges[ i ] ] then 			isRedirect = true 			break 		end 	end 	return t.title, isRedirect end  -- getting sitelink title exclunding redirects function wu.getFilteredSitelink( entity, globalSiteId ) 	local title, isRedirect = wu.getCheckedSitelink( entity, globalSiteId ) 	return ( title and not isRedirect ) and title or nil end  -- convert from url to Q id local function getUnitId( unit ) 	if isSet( unit ) and type( unit ) == 'string' then 		return unit == '1' and unit or unit:sub( unit:find( 'Q', 1, true ), -1 ) 	end 	return '' end  local function getAmount( amount ) 	if amount:sub( 1, 1 ) == '+' then 		amount = amount:sub( 2 ) 	end 	return amount end  local function getBestStatements( entity, p ) 	local tp = type( entity ) 	if tp == 'string' and mw.wikibase.isValidEntityId( entity ) then 		return mw.wikibase.getBestStatements( entity, p ) 	elseif tp == 'table' and entity.labels then 		return entity:getBestStatements( p ) 	end 	return {} end  local function getTime( statement, p ) 	local q 	if statement and statement.qualifiers and statement.qualifiers[ p ] then 		q = statement.qualifiers[ p ][ 1 ] 		if q.snaktype == 'value' and q.datatype == 'time' then 			q = q.datavalue.value.time 			if q:sub( 1, 1 ) ~= '-' then -- B. C. 				return q:sub( 1, 11 ) 			end 		end 	end 	return nil end  local function getStatements( entity, p, count ) 	local ar = {} 	if not ( isSet( entity ) and isSet( p ) ) then 		return ar 	end  	local statements = getBestStatements( entity, p ) 	count = math.min( count or #statements, #statements ) 	if count <= 0 then 		return ar 	end  	local i = 0 	local statement, outdated, startTime, endTime 	repeat 		i = i + 1 		statement = statements[ i ].mainsnak 		if statement.snaktype == 'value' then 			if statement.datatype == 'quantity' then 				statement.datavalue.value.amount = 					getAmount( statement.datavalue.value.amount ) 				statement.datavalue.value.unit = getUnitId( 					statement.datavalue.value.unit ) 			end  			startTime = getTime( statements[ i ], wd.startTime ) 			endTime = getTime( statements[ i ], wd.endTime ) 			if wu.currentTime == '' and ( startTime or endTime ) then 				wu.currentTime = '+' .. mw.getContentLanguage():formatDate( 'c' ):sub( 1, 10 ) 			end  			outdated = false 			if startTime and wu.currentTime < startTime then 				outdated = true 			else 				outdated = endTime and wu.currentTime > endTime 			end  			if not outdated then 				table.insert( ar, statements[ i ] ) 			end 		end 	until i >= #statements or #ar >= count  	return ar end  function wu.getValue( entity, p ) 	local statements = getStatements( entity, p, 1 ) 	if #statements > 0 then 		catTable[ p ] = '' 		return statements[ 1 ].mainsnak.datavalue.value 	end 	return '' end  function wu.getId( entity, p ) 	local value = '' 	local statements = getStatements( entity, p, 1 ) 	if #statements > 0 then 		value = statements[ 1 ].mainsnak.datavalue.value 		value = value.id or '' 		if value ~= '' then 			catTable[ p ] = '' 		end 	end 	return value end  function wu.getValues( entity, p, count ) 	local statements = getStatements( entity, p, count ) 	if #statements > 0 then 		for i = 1, #statements, 1 do 			statements[ i ] = statements[ i ].mainsnak.datavalue.value 		end 		catTable[ p ] = '' 	end 	return statements end  function wu.getIds( entity, p, count ) 	local statements = getStatements( entity, p, count ) 	if #statements > 0 then 		for i = #statements, 1, -1 do 			statements[ i ] = statements[ i ].mainsnak.datavalue.value.id 			if not statements[ i ] then 				table.remove( statements, i ) 			end 		end 		if #statements > 0 then 			catTable[ p ] = '' 		end 	end 	return statements end  function wu.getValuesByLang( entity, p, count, lang ) 	local ar = {} 	local statements = getStatements( entity, p ) 	if #statements > 0 then 		local value 		for i = 1, #statements, 1 do 			value = statements[ i ].mainsnak.datavalue.value 			if value.language and lang == value.language then 				table.insert( ar, value.text ) 			end 			if count and #ar >= count then 				break 			end 		end 	end 	if #ar > 0 then 		catTable[ p ] = '' 	end 	return ar end	  -- get values array for monolingual text function wu.getMonolingualValues( entity, p ) 	local result = {} 	local statements = getStatements( entity, p, nil ) 	if #statements > 0 and statements[ 1 ].mainsnak.datatype == 'monolingualtext' then 		local hyphen, lng, value 		catTable[ p ] = '' 		for i = 1, #statements, 1 do 			value = statements[ i ].mainsnak.datavalue.value 			lng = value.language 			hyphen = lng:find( '-' ) 			if hyphen then 				lng = lng:sub( 1, hyphen - 1 ) 			end 			if not result[ lng ] then 				result[ lng ] = value.text 			end 		end 	end 	return result end  function wu.getValuesByQualifier( entity, p, qualifierP, defaultId ) 	local result = {} 	if not isSet( qualifierP ) then 		return result 	elseif type( defaultId ) ~= 'string' or defaultId == '' then 		defaultId = 'unknown' 	end  	local statements = getStatements( entity, p, nil ) 	if #statements > 0 then 		catTable[ p ] = '' 		local id, statement, value 		for i = 1, #statements do 			statement = statements[ i ] 			-- defaultId is used if a qualifier is missing 			id = defaultId 			value = statement.mainsnak.datavalue.value 			if statement.qualifiers and statement.qualifiers[ qualifierP ] then 				for j, qualifier in ipairs( statement.qualifiers[ qualifierP ] ) do 					if qualifier.snaktype == 'value' then 						id = qualifier.datavalue.value.id 						if id then 							catTable[ qualifierP ] = '' 							break 						end 					end 				end 			end 			result[ id ] = value 		end 	end 	return result end  local function analyzeDatavalue( datavalue, labelFct, ... ) 	local v = datavalue.value 	local t = datavalue.type 	if type( v ) == 'table' then 		-- items which can be reduced to a string 		if t == 'wikibase-entityid' then 			v = v.id 			if type( labelFct ) == 'function' then 				v = labelFct( v, ... ) 			end 		elseif t == 'quantity' then 			v.amount = getAmount( v.amount ) 			if tonumber( v.amount ) == 0 then 				v.amount = '0' 			end 			if v.unit == '1' then 				v = tonumber( v.amount ) or 1 			else 				v.unit = getUnitId( v.unit ) 			end 		elseif t == 'time' then 			v.calendarmodel = getUnitId( v.calendarmodel ) 			if wd.gregorianCalendar[ v.calendarmodel ] then -- is gregorian calendar? 				v = v.time 			end 		end 	end 	return v, t end  -- for qualifiers, references --  { item1, item2, ... } : using named qualifiers/references --  {} : using no qualifiers/references --  nil : using all qualifiers/references function wu.getValuesWithQualifiers( entity, p, values, qualifiers, references, 	count, labelFct, ... ) 	local array, qual 	local function toQualifierTable( tab, key, qualTab, labelFct, ... ) 		local v 		if not tab[ key ] then 			tab[ key ] = {} 		end 		for i = 1, #qualTab do 			qual = qualTab[ i ] 			if qual.snaktype == 'value' then 				v, tab[ key .. '-type' ] = 					analyzeDatavalue( qual.datavalue, labelFct, ... ) 				table.insert( tab[ key ], v ) 			end 		end 		if #tab[ key ] == 0 then 			tab[ key ] = nil 			tab[ key .. '-type' ] = nil 		else 			catTable[ key ] = '' 		end 	end 	local function hasValue( tab, val ) 		for i = 1, #tab do 			if tab[ i ] == val then 				return true 			end 		end 		return false 	end  	local results = {} 	local statements = getStatements( entity, p, count ) 	if #statements == 0 then 		return results 	end 	local i, v 	if type( values ) == 'table' and #values > 0 then 		for i = #statements, 1, -1 do 			v = statements[ i ].mainsnak.datavalue.value 			if type( v ) ~= 'string' then 				v = v.id 			end 			if not isSet( v ) or not hasValue( values, v ) then 				table.remove( statements, i ) 			end 		end 		if #statements == 0 then 			return results 		end 	end 	catTable[ p ] = ''  	if type( qualifiers ) == 'string' then 		qualifiers = { qualifiers } 	end 	if type( references ) == 'string' then 		references = { references } 	end  	local key, reference, statement 	for i = 1, #statements do 		statement = statements[ i ] 		array = { value = analyzeDatavalue( statement.mainsnak.datavalue, labelFct, ... ), 			[ 'value-type' ] = statement.mainsnak.datavalue.type }  		if statement.qualifiers then 			if not qualifiers then -- all qualifier properties 				for key, qualTab in pairs( statement.qualifiers ) do 					toQualifierTable( array, key, qualTab, labelFct, ... ) 				end 			else -- table of selected qualifier properties 				for j = 1, #qualifiers do 					key = qualifiers[ j ] 					if statement.qualifiers[ key ] then 						toQualifierTable( array, key, statement.qualifiers[ key ], labelFct, ... ) 					end 				end 			end 		end  		array.references = {} 		if statement.references then 			for k = 1, #statement.references do 				reference = statement.references[ k ] 				if reference and reference.snaks then 					table.insert( array.references, {} ) 					if not references then -- all references 						for key, refTab in pairs( reference.snaks ) do 							toQualifierTable( array.references[ #array.references ], 								key, refTab ) 						end 					else -- table of selected references 						for j = 1, #references do 							key = references[ j ] 							if reference.snaks[ key ] then 								toQualifierTable( array.references[ #array.references ], 									key, reference.snaks[ key ] ) 							end 						end 					end 				end 			end 		end  		table.insert( results, array ) 	end  	-- clustering statements with identical value 	local helper = {} 	local sort1 = 0 	local mult = false 	local result 	for i = 1, #results do 		result = results[ i ] 		if helper[ result.value ] then 			helper[ result.value ].sort2 = helper[ result.value ].sort2 + 1 			mult = true 		else 			sort1 = sort1 + 1 			helper[ result.value ] = { sort1 = sort1, sort2 = 1 } 		end 		result.sort1 = helper[ result.value ].sort1 		result.sort2 = helper[ result.value ].sort2 	end 	if sort1 > 1 and mult and #results > 2 then 		table.sort( results, 			function( a, b ) 				return a.sort1 < b.sort1 or  					( a.sort1 == b.sort1 and a.sort2 < b.sort2 ) 			end 		) 	end  	return results end  -- extract date from time function wu.getDateFromTime( t ) 	local model = '' -- is Gregorian 	if type( t ) == 'table' then 		model = t.calendarmodel 		t = t.time 	end 	t = t:sub( 2, 11 ) 	return t, model end  -- get lastEdit from reference retrieve date function wu.getLastedit( lastEdit, statements ) 	local isBoolean = type( lastEdit ) == 'boolean' 	if isBoolean and lastEdit == false then 		return lastEdit 	end 	local le = '' 	for i, statement in ipairs( statements ) do 		if statement.references then 			for j, reference in ipairs( statement.references ) do 				if reference[ wd.retrieved ] then 					for k, retrieved in ipairs( reference[ wd.retrieved ] ) do 						retrieved = wu.getDateFromTime( retrieved ) 						if retrieved > le then 							le = retrieved 						end 					end 				end 			end 		end 	end 	if isBoolean then 		return ( le ~= '' ) and le or lastEdit 	else 		return ( le > lastEdit ) and le or lastEdit 	end end  -- maintenance utilities function wu.getCategories( formatStr ) 	if not isSet( formatStr ) then 		formatStr = '[[Category:%s]]' 	end  	catTable.P0 = nil 	local result = '' 	for key, value in pairs( catTable ) do 		result = result .. formatStr:format( key ) 	end 	return result end  return wu