【问题标题】:Basex 8.44 db:replace not replacing existing files with the same nameBasex 8.44 db:replace 不替换同名的现有文件
【发布时间】:2016-06-08 17:53:55
【问题描述】:

basex Database_Module db:replace "将数据库 $db 中由 $path 指定的资源替换为 $input 的内容,或者将其添加为新资源"。

db:add 文档建议“具有相同路径的文档可能会在数据库中出现多次。如果要强制执行单个实例,请改用 db:replace。”

鉴于我不理解以下内容的结果

我有一个 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

我确实想强制执行单个实例,所以我做错了什么。

非常感谢

【问题讨论】:

    标签: xquery basex


    【解决方案1】:

    感谢您的观察,听起来像是一个错误。应该很快就会修复(请参阅https://github.com/BaseXdb/basex/issues/1302 了解即将发布的详细信息)。

    一旦解决了这个问题,您的查询可能会触发错误(因为您试图多次写入同一位置,而所有其他 XQuery 更新表达式都不允许这样做)。分组可以解决问题:

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

    【讨论】:

    • 好吧,我不清楚为什么我需要一个 db:replace 函数。我确实有逻辑在 saxon 中进行分组,但是内存消耗非常大,我希望有一个简单的替代方法,比如替换功能,它只是覆盖现有文档。
    • 我只是想敦促您保留 basex 文档中所述的 db:replace 功能。数据库中的这种功能可以用一个使用相同文件名的函数调用替换现有文档,这是一件好事。我相信 Marklogic 有逻辑根据文档关联的数据库文件路径覆盖现有文档。
    • XQuery 更新语义对于更新表达式的评估和操作引起的冲突非常严格(参见例如docs.basex.org/wiki/XQuery_Update#Pending_Update_List)。这意味着文档在执行之前无论如何都会被缓存,并且我们不应该允许对同一目标进行多次操作(因为不清楚哪个文档最终在数据库中)。我假设按解决方案分组甚至会更快,内存消耗更少。如果您有后续查询访问数据库,则仍然需要 db:replace,因此其语义不会改变。
    • StackOverflow cmets 中的空间有限;如果您有更多问题,请随时向我们的邮件列表发送邮件!
    • 最后一点……您也可以按如下方式开始查询:for $item in collection("/mnt/06_08_2016_08_50_20/XML/")//item
    【解决方案2】:

    我最终根据 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 ( )  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 2013-07-04
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多