2016-10-27 43 views
1

我想要在Marklogic數據庫中獲得所有不同文檔結構的列表。Marklogic - 獲取Marklogic數據庫中所有獨特文檔結構的列表

例如與這3個文檔的數據庫:

1)<文件> <名>羅伯特< /名稱> < /文件>
2)<文件> <名>馬克< /名稱> < /文件>
3 )<資料> <fname> Robert </fname > <lname>史密斯</L-NAME > < /文件>

將返回有兩個獨特的文檔結構的數據庫,一個使用2個文件,以及其他通過1號文件中。

我用這XQuery和我正確地找回元素的唯一序列名單:

for $i in distinct-values(for $document in doc() 
return <div>{distinct-values(
for $element in $document//*/*/name() return <div>{$element}</div>)} </div>) 
return $i 

我很欣賞這個代碼將無法處理重複的元素名稱,但是這是確定的現在。

我的筆試題是:

1)有沒有更好/更有效的方式來做到這一點?我假設是。
2)有沒有辦法找回足夠的細節,以便我可以建立每個獨特結構的xml樹?
3)什麼是最好的方式來返回每個不同的結構,例如2和1,在上面的例子中

+0

如果有人AHS提供足夠的解決方案,請註明的答案接受。否則,請詳細說明這個問題,以便其他人可以提供幫助。 –

回答

1

如果你有,你需要做到這一點的,可以考慮合作次數或其他similiar解決方案元素的有限列表:https://docs.marklogic.com/cts:value-co-occurrences

這就要求每個一系列指標有問題的元素。

MarkLogic儘可能使用索引。我能想到的另一個解決方案是,您實際上爲每個有問題的文檔創建目標內容值的散列/校驗和,並將其與文檔一起存儲(如果您碰巧擁有語義許可證,則存儲在三元組中)。然後你就可以擁有一個 的獨特組合。

+0

這聽起來像OP在尋找獨特的文檔結構,並忽略了值。 –

+0

正確。我不關心元素值,只是結構。 – Robert

0

1)有沒有更好/更有效的方法來做到這一點?我假設是。

如果取決於我,我會創建以一致的方式構建的文檔(如您正在做的),然後對其進行散列,然後將散列作爲集合附加到每個文檔。然後我可以統計每個集合中的文檔。我沒有看到任何有效的方法(使用索引)在首先寫入文檔內容或元數據(集合是一種元數據)的情況下獲取計數,然後查詢索引。

2)有沒有辦法找回足夠的細節,以便我可以建立每個獨特結構的xml樹?

獲得每個集合的計數後,您可以從每個集合中檢索一個文檔並遍歷它以構建空的XML結構。如果您已經瞭解XSLT,那麼XSLT可能是一個很好的方法。

3)什麼是最好的方式來返回每個不同的結構,例如2和1以及上例中的

打開數據庫的集合詞典。然後做類似如下:

在CTS $集合:集合() 回報($集合,CTS:頻率($集合))

+0

謝謝,哈希/集合很適合獲得一個計數和(更多)更有效地檢查數據庫中的獨特XML結構。 – Robert

0

不知道我完全地按照你所追求的,但我我想知道,如果這是更你在找什麼換functx:distinct-element-paths($doc)

http://www.xqueryfunctions.com/xq/functx_distinct-element-paths.html

這裏有一個簡單的例子:

xquery version "1.0-ml"; 
import module namespace functx = "http://www.functx.com" at "/MarkLogic/functx/functx-1.0-nodoc-2007-01.xqy"; 

let $doc := <document><fname>Robert</fname><lname>Smith</lname></document> 

return 
    functx:distinct-element-paths($doc) 

輸出以下字符串(可以解析,當然):

document 
document/fname 
document/lname