« Module:Wikidata/Analyse transitive » : différence entre les versions

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
Aucun résumé des modifications
0x010D (discussion | contributions)
Aucun résumé des modifications
Ligne 21 : Ligne 21 :


-- add new items to a list, avoiding duplicates
-- add new items to a list, avoiding duplicates
local function addnewvalues(olditems, newitems)
local function addnewvalues(olditems, newitems, maxnum, stopval)
if not newitems then
if not newitems then
return olditems
return olditems
end
end
for _, qid in pairs(newitems) do
for _, qid in pairs(newitems) do
if stopval and (qid == stopval) then
table.insert(olditems, qid)
return olditems
end
if maxnum and (#olditems >= maxnum) then
return olditems
end
if not alreadyHere(olditems, qid) then
if not alreadyHere(olditems, qid) then
table.insert(olditems, qid)
table.insert(olditems, qid)
Ligne 34 : Ligne 41 :


-- recursively adds a list of qid to an existing list, based on the results of a query  
-- recursively adds a list of qid to an existing list, based on the results of a query  
local function continuevals(origlist, query, maxdepth, maxnodes)
function p.addVals(origlist, query, maxdepth, maxnodes, stopval)
maxdepth = maxdepth or 10
maxdepth = maxdepth or 10
maxnodes = maxnodes or 100
maxnodes = maxnodes or 100
if (maxdepth < 0) then
if (maxdepth < 0) then
return origlist
return origlist
end
end
 
if stopval and alreadyHere(origlist, stopval) then
return origlist
end
local list = {}
local list = {}
for i, j in pairs(origlist) do -- seul moyen de copier une liste
for i, j in pairs(origlist) do -- seul moyen de copier une liste
Ligne 49 : Ligne 58 :
for i, item in pairs(origlist) do
for i, item in pairs(origlist) do
local candidates = getids(item, query)
local candidates = getids(item, query)
list = addnewvalues(list, candidates)
list = addnewvalues(list, candidates, maxnum, stopval)
if #list >= maxnodes then
if #list >= maxnodes then
return list
return list
Ligne 57 : Ligne 66 :
return list
return list
end
end
return continuevals(list, query, maxdepth - 1, maxnodes)
return p.addVals(list, query, maxdepth - 1, maxnodes, stopval)
end
end


-- returns a list of items transitively matching a query
-- returns a list of items transitively matching a query (orig item is not included in the list)
function p.transitiveVals(item, query, maxdepth, maxnodes)
function p.transitiveVals(item, query, maxdepth, maxnodes, stopval)
local vals = getids(item, query)
local vals = getids(item, query)
if not vals then
if not vals then
return nil
return nil
end
end
return continuevals(vals, query, maxdepth - 1, maxnodes)
return p.addVals(vals, query, maxdepth - 1, maxnodes, stopval)
end
end


-- returns true if an item is the value of a query, transitively
-- returns true if an item is the value of a query, transitively
function p.inTransitiveVals(searchedval, sourceval, query, maxdepth, checked )
function p.inTransitiveVals(searchedval, sourceval, query, maxdepth, maxnodes )
maxdepth = maxdepth or 10
local vals = p.transitiveVals(sourceval, query, maxdepth, maxnodes, searchedval )
if not checked then
if vals and vals[#vals] == searchedval then
checked = {}
end
if maxdepth < 0 then
return false
end
local acceptedvals = p.transitiveVals( sourceval, query, 0) -- width first
if not acceptedvals then
return false
end
if alreadyHere(acceptedvals, searchedval) then
return true
return true
end
for i, j in pairs(acceptedvals) do
local success
if not alreadyHere(checked, j) then
table.insert(checked, j)
success = p.inTransitiveVals(searchedval, j, query, maxdepth -1, checked)
end
if success then
return true
end
end
end
return false
return false

Version du 28 août 2015 à 15:49

-- Helpers for queries using transitive properties

local p = {} local wd = require "Module:Wikidata"

local function getids(item, query) query.excludespecial = true query.displayformat = 'raw' query.entity = item return wd.stringTable(query) end

local function alreadyHere(searchset, val) for i, j in pairs(searchset) do if val == j then return true end end return false end

-- add new items to a list, avoiding duplicates local function addnewvalues(olditems, newitems, maxnum, stopval) if not newitems then return olditems end for _, qid in pairs(newitems) do if stopval and (qid == stopval) then table.insert(olditems, qid) return olditems end if maxnum and (#olditems >= maxnum) then return olditems end if not alreadyHere(olditems, qid) then table.insert(olditems, qid) end end return olditems end

-- recursively adds a list of qid to an existing list, based on the results of a query function p.addVals(origlist, query, maxdepth, maxnodes, stopval) maxdepth = maxdepth or 10 maxnodes = maxnodes or 100 if (maxdepth < 0) then return origlist end if stopval and alreadyHere(origlist, stopval) then return origlist end

local list = {} for i, j in pairs(origlist) do -- seul moyen de copier une liste table.insert(list, j) end

for i, item in pairs(origlist) do local candidates = getids(item, query) list = addnewvalues(list, candidates, maxnum, stopval) if #list >= maxnodes then return list end end if (#list == #origlist) then return list end return p.addVals(list, query, maxdepth - 1, maxnodes, stopval) end

-- returns a list of items transitively matching a query (orig item is not included in the list) function p.transitiveVals(item, query, maxdepth, maxnodes, stopval) local vals = getids(item, query) if not vals then return nil end return p.addVals(vals, query, maxdepth - 1, maxnodes, stopval) end

-- returns true if an item is the value of a query, transitively function p.inTransitiveVals(searchedval, sourceval, query, maxdepth, maxnodes ) local vals = p.transitiveVals(sourceval, query, maxdepth, maxnodes, searchedval ) if vals and vals[#vals] == searchedval then return true end return false end

-- returns true if an item is a superclass of another, based on P279 function p.isSubclass(class, item, maxdepth) query = {property = 'P279'} if class == item then -- item is a subclass of itself iff it is a class if getids(item, query) then return true end return false end return p.inTransitiveVals(class, item, query, maxdepth ) end

-- returns true if one of the best ranked P31 values of an item is the target or a subclass of the target -- 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 function p.isInstance(targetclass, item, maxdepth) maxdepth = maxdepth or 10 local directclasses = p.transitiveVals(item, {property = 'P31'}, 1) if not directclasses then return false end for i, class in pairs(directclasses) do if p.isSubclass(targetclass, class, maxdepth - 1) then return true end end return false end

return p