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 ( )