|
@@ -159,39 +159,70 @@ M.rsrc_to_graph = function(rsrc)
|
|
|
local gr = graph.new(nil)
|
|
|
|
|
|
it = gr:add_init()
|
|
|
- for k, v in pairs(rsrc) do
|
|
|
- if k == "id" then goto skip end
|
|
|
- logger:debug(("Adding attribute: %s = %s"):format(k, pp.write(v)))
|
|
|
- local p = model.id_to_uri[k]
|
|
|
+ for prop, v in pairs(rsrc) do
|
|
|
+ if prop == "id" then goto skip end
|
|
|
+ logger:debug(("Adding attribute: %s = %s"):format(prop, pp.write(v)))
|
|
|
+ local p = model.id_to_uri[prop]
|
|
|
if not p then
|
|
|
logger:warn(
|
|
|
("Term %s has no URI mapped. Assigning `pas:%s`.")
|
|
|
- :format(k, k))
|
|
|
- p = term.new_iriref_ns("pas:" .. k)
|
|
|
+ :format(prop, prop))
|
|
|
+ p = term.new_iriref_ns("pas:" .. prop)
|
|
|
end
|
|
|
- local datatype = ((rmod.properties or NT)[k] or NT).type
|
|
|
- local rdf_type_str = pkar.config.md.datatypes[datatype]
|
|
|
+ local pconf = (rmod.properties or NT)[prop] or NT
|
|
|
+ local rdf_type_str = pkar.config.md.datatypes[pconf.type]
|
|
|
local rdf_type
|
|
|
if rdf_type_str then
|
|
|
rdf_type = term.new_iriref_ns(rdf_type_str).data
|
|
|
end
|
|
|
-- Force all fields to be multi-valued.
|
|
|
if type(v) ~= "table" then v = {v} end
|
|
|
+
|
|
|
+ -- Convert values to URIs.
|
|
|
local o
|
|
|
+ --if prop == "has_member" then dbg() end
|
|
|
for i, vv in ipairs(v) do
|
|
|
- if k == "content_type" then
|
|
|
- vv = rmod.uri
|
|
|
- end
|
|
|
- if datatype == "resource" then
|
|
|
+ if prop == "content_type" then
|
|
|
+ o = term.new_iriref_ns(rmod.uri)
|
|
|
+ elseif pconf.type == "resource" then
|
|
|
if not vv:match("^[a-z]*:") then
|
|
|
-- Convert local path to URIs.
|
|
|
- vv = assert(path_to_uri[vv]) end
|
|
|
- o = term.new_iriref_ns(vv)
|
|
|
- elseif datatype == "ext_resource" then
|
|
|
+ v[i] = assert(path_to_uri[vv]) end
|
|
|
+ o = term.new_iriref_ns(v[i])
|
|
|
+ elseif pconf.type == "ext_resource" then
|
|
|
o = term.new_iriref(vv)
|
|
|
else o = term.new_lit(vv, rdf_type) end
|
|
|
it:add_iter(triple.new(s, p, o))
|
|
|
end
|
|
|
+
|
|
|
+ -- Create implicit bricks for "has_member" property.
|
|
|
+ if prop == "has_member" then
|
|
|
+ local proxy_s
|
|
|
+ for i, vv in ipairs(v) do
|
|
|
+ -- Add linked list proxies.
|
|
|
+ local brick_uri = term.new_iriref_ns("par:" .. M.idgen())
|
|
|
+ if i == 1 then
|
|
|
+ proxy_s = s
|
|
|
+ it:add_iter(triple.new(proxy_s, pkar.FIRST_P, brick_uri))
|
|
|
+
|
|
|
+ -- Add the "has member" property.
|
|
|
+ it:add_iter(triple.new(
|
|
|
+ s,
|
|
|
+ term.new_iriref_ns(pconf.uri),
|
|
|
+ term.new_iriref_ns(vv)))
|
|
|
+ else
|
|
|
+ it:add_iter(triple.new(proxy_s, pkar.NEXT_P, brick_uri))
|
|
|
+ end
|
|
|
+ -- Add the reference.
|
|
|
+ it:add_iter(triple.new(
|
|
|
+ brick_uri,
|
|
|
+ term.new_iriref_ns("pas:ref"),
|
|
|
+ term.new_iriref_ns(vv)))
|
|
|
+ proxy_s = brick_uri
|
|
|
+ end
|
|
|
+
|
|
|
+ goto skip
|
|
|
+ end
|
|
|
::skip::
|
|
|
end
|
|
|
for i, m in ipairs(rmod.lineage) do
|