2016-06-08 62 views
0

basex Database_Module db:replace「將數據庫$ db中的$ path指定的資源替換爲$ input的內容,或將其添加爲新資源」。Basex 8.44 db:替換不替換具有相同名稱的現有文件

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 

我希望只有2個文件,在使用這些名稱的數據庫中存在不28使用數據庫時:更換插入

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

我不希望強制實施單一的情況下,所以我在做什麼不正確。

非常感謝

回答

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

好的,我不清楚爲什麼我需要db:replace函數。我確實有邏輯在撒克遜分組但是內存消耗是如此之大,我希望有一個簡單的替代方法,就像覆蓋現有文檔的替換函數。 – conteh

+0

我只是想敦促你保持db:replace的功能,如basex文檔中所述。數據庫中的這種功能用一個函數調用用相同的文件名替換現有文檔是一件好事。我相信Marklogic有邏輯根據與文檔關聯的數據庫文件路徑覆蓋現有的文檔。 – conteh

+0

有關更新表達式和操作引起的衝突評估,XQuery Update語義非常嚴格(請參閱http://docs.basex.org/wiki/XQuery_Update#Pending_Update_List)。這意味着文檔在被執行之前將被緩存,並且我們不應該允許超過同一個目標的操作(因爲它不會清楚哪個文檔在db中結束)。我假設解決方案組將更快,內存消耗更少。 db:如果你有後續的查詢訪問數據庫,仍然需要替換,所以它的語義不會改變。 –

0

我最終根據基督教的反饋做了以下工作,它首先檢查在添加到數據庫之前文件是否存在。

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 () 
相關問題