Basex 8.44 db:替换不替换具有相同名称的现有文件

时间:2016-06-08 17:53:55

标签: xquery basex

basex enter image description here"使用$ input的内容替换数据库$ db中由$ path指定的资源,或将其添加为新资源"。

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

鉴于我不理解我接下来的结果

我有一些xml文档集合,其中包含

等项目
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)

我使用以下xquery读取集合中的每个文件,使用从item属性构造的文件名保存每个项目,以便仅使用db:replace命令保存对这些属性列表唯一的项目

let $items := //item[@CRD ='170562']
for $item in $items
return fn:base-uri($item)

根据我的查询

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

即使只有两个唯一的文件名,也会创建28个xml文件。

FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml

我希望数据库中只存在2个文件,这些名称在使用db时不是28个:替换为插入

Const Compare_Files   As String = "Table2"
Const SQL_UPDATE_DATA As String = "SELECT * FROM [" & Compare_Files & "] WHERE F2 Is Null"


Dim rs          As DAO.Recordset
Dim strF1Data   As String
Dim varData     As Variant

Set rs = CurrentDb.OpenRecordset(SQL_UPDATE_DATA)
With rs
    Do Until .EOF
        strF1Data = !F1
        varData = Split(strF1Data, ";")
        If UBound(varData) = 4 Then
            .Edit
            !F1 = varData(0)
            !F2 = varData(1)
            !F3 = varData(2)
            !F4 = varData(3)
            !F5 = varData(4)
            .Update
        End If
        .MoveNext
    Loop
    .Close
End With

Set rs = Nothing

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

非常感谢

2 个答案:

答案 0 :(得分:1)

感谢您的观察,听起来像一个错误。应尽快修复(有关详细信息,请参阅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])

答案 1 :(得分:0)

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