MarkLogicサーバーのデータ[パート1]

MarkLogicサーバーは、ドキュメントベースのネイティブXMLデータベースです。 MarkLogicサーバーのドキュメント指向DBと同様に、データはファイルフォルダー構造として表すことができます。 ところで、WebDAV経由でリポジトリにアクセスする場合、データはまさにこの方法で表示されます。 XML自体に加えて、MarkLogicサーバーは任意のバイナリデータをファイルの形式で保存できます。

MarkLogicサーバーのXMLデータの内部表現は非常に複雑であり、後で説明します。 ここで、MarkLogicサーバーにはプレーンテキストではなく、XML型のデータのオブジェクトとして保存されるため、整形式のXMLのみを配置できることに言及する価値があります。 XMLデータの内部表現のエンコードはUnicodeであり、異なる言語での多くの問題を排除します。 XMLデータのすべてのエンティティは、デジタルエンティティに展開されます。 それらがドキュメントで使用されている場合、これは問題を引き起こしません。


2つの興味深い質問を考えてみてください-MarkLogicサーバーのドキュメントへのアクセスと、これらのドキュメントでの記入です。

さらに、フォームのドキュメントがデータベースに保存されているという事実から進みます
<horse xmlns=”ns1”> <location>vacuum</location> <geometry>spherical</geometry> </horse> 

そして、このように保存されます
 /horses/ horse1.xml horse2.xml … 

XPathの場合、接頭辞ns1 =” ns1”を使用します

まず、XQueryコードでデータベースからXMLドキュメントを取得(読み取り)する方法を見ていきます。

1つのドキュメントを読むには、次のようにfn:doc関数を使用する必要があります
 let $id := "horse1" let $uri := fn:concat("/horses/", $id, ".xml") return fn:doc( $uri ) 

ドキュメントへのパスをパラメーターとして指定し、その内容を取得します
 fn:doc( [$uri as xs:string*] ) as document-node()* 

この関数の結果は、XMLドキュメントのルート要素(タグ)、 ドキュメント() 、テキストドキュメントのテキスト()要素、バイナリドキュメントのバイナリ()要素です。

この関数のXML結果に任意のXPathを適用できます。 そのように
 fn:doc( $uri )/ns1:horse 

または、タグのリストを取得しますns1:場所
 fn:doc( $uri )/ns1:horse/ns1:location 

またはそのようにします
 fn:doc( $uri )//ns1:location 


MarkLogicサーバーのドキュメントは、異なるディレクトリに保存することで論理グループにグループ化できます。 たとえば、ドキュメント(オブジェクト) “ horseN.xml”はディレクトリ“ / horses /”に保存されます。 しかし! 多くの場合、ドキュメントの重複グループ(関連付け)を作成する必要があります。 これらの目的のため、およびMarkLogicサーバーのドキュメントへのアクセスを高速化するために、収集メカニズムがあります。 各ドキュメントは同時に複数のコレクションで構成できますが、これに制限はありません。

次に、コレクションからドキュメントを取得する方法を検討します。 私たちのドキュメントがhorses-collectionに含まれていると仮定すると、コレクションへのアクセスは次のようになります
 let $collections := ("horses-collection") return fn:collection($collections) 

ここで、 $ collectionsは、ドキュメントを受け取りたいコレクションのリストです
 fn:collection( [$uri as xs:string*] ) as document-node()* 

この関数は、指定されたコレクションに含まれるドキュメントを返します。 fn:コレクションの結果は、ドキュメントのリストです。

fn:コレクション関数の$ uriパラメーターはオプションです。 存在しない場合、 fn:コレクションはデータベース内のすべてのドキュメントのリストを返します。 次の式により、これを行うことができます
 fn:collection() 

MarkLogicサーバーのコレクションを事前に作成または構成する必要がないことに注意してください。 存在しないコレクションにドキュメントが追加されると、それと共に作成され、ドキュメントは新しく作成されたコレクションに配置されます。 このアプローチにより、コレクションを動的に作成できます。 これにより、リポジトリ内のドキュメントへのクイックアクセスを整理する際の柔軟性がさらに高まります。

開発者が追加したドキュメントにアクセスして、XQueryプログラムのコードを簡素化する別の方法があります。
 /ns1:horse 

この式は次と同等です
 fn:collection()/ns1:horse 

つまり、リポジトリ内のすべてのドキュメントをスキャンし、ルートタグns1:horseを持つドキュメントのコンテンツを返します。

XQueryコードでは、XPathをブリーチされた要素として記述でき、リポジトリ内のすべてのドキュメントに適用され、その実行結果を返すことがわかります。

データベースからデータを取得するには、このアプローチを慎重に使用することが非常に必要です。これは、大量のドキュメントがある場合、多大なリソースと時間が必要になる可能性があるためです。

次の式の結果は、ns1の同じリストになりますが、実行されると、データベース内の各タグがスキャンされます。これは非常に時間がかかるタスクです。
 //ns1:horse 

データを取得するこの方法の使用は、XMLドキュメント内の特定の場所が不明または常にではないすべてのタグを選択する必要がある場合にのみ正当化されます。 この場合にのみ、リポジトリ内のすべてのタグをスキャンすることが正当化されます。 また、この場合のクエリパフォーマンスは、特に多数のドキュメントまたはタグが含まれている場合、桁違いに低くなることを忘れないでください。

文書は、コレクションに結合せずに1つのディレクトリに保存される場合があります。 しかし同時に、同じディレクトリ内のドキュメントの場所はプログラムのロジックで意味があり、これらのドキュメントに単一のエンティティとしてアクセスする必要があります。 このタスクを実行するには、次の方法を使用できます
 xdmp:directory("/horses /", "1")/ns1:horse 

xdmp:ディレクトリ関数は、指定されたディレクトリ内のすべてのドキュメントを返します
 xdmp:directory( $uri as xs:string*, [$depth as xs:string?] ) as document-node()* 

ここで、オプションの変数は2つの値「1」「infinity」を取ることができますが、結果に含まれるドキュメントのネストの深さを記述します。 $ depth =“ 1”の場合、MarkLogicサーバーは指定されたディレクトリ内のドキュメントに制限しますが、 “ infinity”はドキュメントを検索する際にすべてのサブディレクトリをスキャンします。

上記のXPath式はすべて単純ですが、代わりに似たようなものがあるかもしれません。
 //ns1:location[ (fn:starts-with(., “va”) and fn:starts-with(., “m”)) or (. eq “location1”) ] 

高度なXPathにより、リクエストを完了するために必要なリソースが大幅に増加します。 必要に応じて、単純なXPath式を使用するコレクションやディレクトリなどのDB自体を使用して、データベースからのドキュメントの受信を整理することをお勧めします。

2番目の重要な問題は、ベースの充填です。 MarkLogicサーバーはXQueryのXQuery Update拡張機能をサポートせず、そのAPIを介してドキュメント操作機能を提供することをすぐに言わなければなりません。

データベースへの入力は、いくつかの方法で実行できます。

1. XQueryコードから直接ドキュメントを作成します。 このようなものになります
 declare variable $collections := ("horses"); let $uri := “/horses/horse1.xml” let $horse := <horse xmlns=”ns1”> <location>vacuum</location> <geometry>spherical</geometry> </horse> return xdmp:document-insert( $uri, $horse, xdmp:default-permissions(), $collections ) 

xdmp:document-insert関数のパラメーターは次のようになります
 xdmp:document-insert( $uri as xs:string, $root as node(), [$permissions as element(sec:permission)*], [$collections as xs:string*], [$quality as xs:int?], [$forest-ids as xs:unsignedLong*] ) as empty-sequence() 

ここで、 $ uriは、リポジトリのルートに関連するドキュメントのアドレスです。 MarkLogicサーバーデータベースの設定では、ディレクトリの自動作成を有効にすることができ、 $ uriは存在しないディレクトリを参照でき、ドキュメントの作成時に作成されます。
$ root-ドキュメント本文
$権限 -ドキュメントアクセス設定
$ collections-ドキュメントが含まれるコレクションのリスト。

2. WebDAV経由でデータをダウンロードします。 この方法は、非常に大量のデータをリポジトリにロードするのに適しています。 WebDAVを介してアクセスするには、MarkLogicサーバーでアクセスするデータベースに対応する(WebDAV)アプリケーションサーバーを作成する必要があります。

3.大量のデータまたは非常に特殊なタスクの場合、MarkLogicサーバーにドキュメントをアップロードするために設計されたjavaユーティリティRecordLoaderを使用できます。

4. AutoLoaderは、ファイルシステム上の変更を追跡し、ドキュメントをMarkLogicサーバーに自動的にアップロードできる便利なユーティリティです。 ダウンロードには、ユーティリティRecordLoaderが使用されます。

Source: https://habr.com/ru/post/J194550/


All Articles