Basex 8.44 db:replace 不替换现有的同名文件
Basex 8.44 db:replace not replacing existing files with the same name
basex Database_Module db:replace "Replaces a resource, specified by $path, in the database $db with the contents of $input, or adds it as a new resource"。
db:add 文档建议 "A document with the same path may occur more than once in a database. If you want to enforce single instances, use db:replace instead."
鉴于我不理解我得到的结果
我收集了 xml 个文档,其中包含
<item X="14-03-04-SEC_Exempt_Reporting_Adviser_Report_2014-3-4"
DATE="2014-03-04"
TYPE="XLSX"
CRD="170562"
PRIMARYNAME="LAUNCH ANGELS"
LEGALNAME=""
STATE="MA"
COUNTRY="US"/>
我正在使用以下 xquery 读取集合中的每个文件,并使用根据项目属性构造的文件名保存每个项目,以便使用 db:replace 命令仅保存那些属性列表独有的项目
declare namespace db="http://basex.org/modules/db";
declare namespace file="http://expath.org/ns/file";
for $file in file:list("/mnt/06_08_2016_08_50_20/XML/", false(), "*.xml")
let $doc := doc(concat("/mnt/06_08_2016_08_50_20/XML/", $file))
for $item in $doc//item
return
let $file := replace(concat($item/@CRD,$item/@PRIMARYNAME,$item/@LEGALNAME,$item/@STATE,$item/@COUNTRY,'.xml'),'\s+','')
return db:replace('FOIA', $file, $item)
根据我的查询
let $items := //item[@CRD ='170562']
for $item in $items
return fn:base-uri($item)
创建了 28 个 xml 个文件,尽管只有两个唯一的文件名。
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
当使用 db:replace 插入
时,我希望数据库中只存在 2 个文件,这些文件的名称不是 28
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
我确实想强制执行单个实例,所以我做错了什么。
非常感谢
感谢您的观察,听起来像是一个错误。应尽快修复(有关即将发布的详细信息,请参阅 https://github.com/BaseXdb/basex/issues/1302)。
修复此问题后,您的查询可能会触发错误(因为您试图多次写入同一位置,这是所有其他 XQuery Update 表达式所不允许的)。分组就可以了:
declare namespace db="http://basex.org/modules/db";
declare namespace file="http://expath.org/ns/file";
for $file in file:list("/mnt/06_08_2016_08_50_20/XML/", false(), "*.xml")
let $doc := doc(concat("/mnt/06_08_2016_08_50_20/XML/", $file))
for $item in $doc//item
group by $file := replace(concat($item/(@CRD,@PRIMARYNAME,@LEGALNAME,@STATE,@COUNTRY),'.xml'),'\s+' ,'')
return db:replace('FOIA', $file, $item[1])
我最终根据 Christian 的反馈执行了以下操作,在添加到数据库之前首先检查文件是否存在。
declare namespace db="http://basex.org/modules/db";
declare namespace file="http://expath.org/ns/file";
declare variable $path as xs:string external;
for $item in collection($path)//item
group by $filename := replace(concat($item/@CRD,$item/@PRIMARYNAME,$item/@LEGALNAME,$item/@STATE,$item/@COUNTRY,'.xml'),'\s+','')
return if (not(db:exists('FOIA', $filename))) then
db:replace('FOIA', $filename, $item[1])
else ( )
basex Database_Module db:replace "Replaces a resource, specified by $path, in the database $db with the contents of $input, or adds it as a new resource"。
db:add 文档建议 "A document with the same path may occur more than once in a database. If you want to enforce single instances, use db:replace instead."
鉴于我不理解我得到的结果
我收集了 xml 个文档,其中包含
<item X="14-03-04-SEC_Exempt_Reporting_Adviser_Report_2014-3-4"
DATE="2014-03-04"
TYPE="XLSX"
CRD="170562"
PRIMARYNAME="LAUNCH ANGELS"
LEGALNAME=""
STATE="MA"
COUNTRY="US"/>
我正在使用以下 xquery 读取集合中的每个文件,并使用根据项目属性构造的文件名保存每个项目,以便使用 db:replace 命令仅保存那些属性列表独有的项目
declare namespace db="http://basex.org/modules/db";
declare namespace file="http://expath.org/ns/file";
for $file in file:list("/mnt/06_08_2016_08_50_20/XML/", false(), "*.xml")
let $doc := doc(concat("/mnt/06_08_2016_08_50_20/XML/", $file))
for $item in $doc//item
return
let $file := replace(concat($item/@CRD,$item/@PRIMARYNAME,$item/@LEGALNAME,$item/@STATE,$item/@COUNTRY,'.xml'),'\s+','')
return db:replace('FOIA', $file, $item)
根据我的查询
let $items := //item[@CRD ='170562']
for $item in $items
return fn:base-uri($item)
创建了 28 个 xml 个文件,尽管只有两个唯一的文件名。
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
当使用 db:replace 插入
时,我希望数据库中只存在 2 个文件,这些文件的名称不是 28FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
我确实想强制执行单个实例,所以我做错了什么。
非常感谢
感谢您的观察,听起来像是一个错误。应尽快修复(有关即将发布的详细信息,请参阅 https://github.com/BaseXdb/basex/issues/1302)。
修复此问题后,您的查询可能会触发错误(因为您试图多次写入同一位置,这是所有其他 XQuery Update 表达式所不允许的)。分组就可以了:
declare namespace db="http://basex.org/modules/db";
declare namespace file="http://expath.org/ns/file";
for $file in file:list("/mnt/06_08_2016_08_50_20/XML/", false(), "*.xml")
let $doc := doc(concat("/mnt/06_08_2016_08_50_20/XML/", $file))
for $item in $doc//item
group by $file := replace(concat($item/(@CRD,@PRIMARYNAME,@LEGALNAME,@STATE,@COUNTRY),'.xml'),'\s+' ,'')
return db:replace('FOIA', $file, $item[1])
我最终根据 Christian 的反馈执行了以下操作,在添加到数据库之前首先检查文件是否存在。
declare namespace db="http://basex.org/modules/db";
declare namespace file="http://expath.org/ns/file";
declare variable $path as xs:string external;
for $item in collection($path)//item
group by $filename := replace(concat($item/@CRD,$item/@PRIMARYNAME,$item/@LEGALNAME,$item/@STATE,$item/@COUNTRY,'.xml'),'\s+','')
return if (not(db:exists('FOIA', $filename))) then
db:replace('FOIA', $filename, $item[1])
else ( )