我想要获得Marklogic数据库中所有不同文档结构的列表和计数。
例如,包含以下3个文档的数据库:
1)罗伯特
2)标记
3) RobertSmith
将返回数据库中有两个唯一的文档结构,一个由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,在上面的示例中
发布于 2016-10-27 15:21:46
如果您有一个有限的元素列表,需要对其执行此操作,请考虑共现或其他类似的解决方案:https://docs.marklogic.com/cts:value-co-occurrences
这需要对每个有问题的元素建立一个范围索引。
只要有可能,MarkLogic最好使用索引。我能想到的另一个解决方案是,实际上为每个文档的目标内容的值创建一个散列/校验和,并将其与文档一起存储(如果您恰好有语义许可证,也可以存储在一个三元组中)。然后你,你就已经有了一个唯一组合的键。
发布于 2016-10-28 00:13:47
1)有没有更好/更有效的方法来做到这一点?我假设是这样的。
如果由我决定,我会以一致的方式创建结构化的文档(就像您正在做的那样),然后对其进行散列,并将散列作为集合附加到每个文档。然后我可以计算每个集合中的文档数量。我看不到任何有效的方法(使用索引)来获取计数,除非首先写入文档内容或元数据(集合是元数据的一种类型),然后查询索引。
XML2)有没有方法可以获得足够的细节,以便我可以构建每个独特结构的
树?
获得每个集合的计数后,可以从每个集合中检索一个文档,并遍历它以构建一个空的XML结构。如果您已经了解XSLT,那么XSLT可能是一种很好的方法。
3)返回每个不同结构的计数的最佳方法是什么,例如2和1,在上面的示例中
打开数据库上的集合词典。然后执行类似以下的操作:
对于cts中的频率:$collection () return ($collection,cts:$collection($collection))
发布于 2016-10-28 04:36:24
我不确定我是否完全理解了你想要什么,但我想知道这是不是更多你想要的东西-- 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/lnamehttps://stackoverflow.com/questions/40275741
复制相似问题