5

次の Marklogic クエリをクエリ コンソールで実行すると、管理者権限を持つシステム ユーザーを取得できます。

xquery version "1.0-ml";
import schema namespace bfa="http://bitfood.org/auth" at "schema/auth/bitfood-auth.xsd";
cts:search(/bfa:AppUser[bfa:appAccess/@appRole = "ROLE_SYS_ADMIN"], cts:and-query(()))

無知で申し訳ありませんが、Java クライアント API のみを使用してこのクエリを実装することは可能ですか?

XCC 経由で生のクエリを使用できることはわかっていますが、可能な限りそれを回避しようとしています。

残念ながら、他の検索方法を簡単に扱っているJavaクライアントAPIのドキュメントを掘り下げてきましたが、これが可能であることを示唆するものは何も見つかりませんでした.

更新 1:皆さん、私はここでショーストッパーに当たったと思います。

この質問によると、Java クライアント API のクエリ オプション構築機能は非推奨としてマークされています。

@ehennum は、XML または JSON クエリ オプションを使用する代替案を提案しています。ただし、このようなクエリ オプションの指定は、基本的にコード内で生の文字列として定義されています

String xmlOptions =
  "<search:options "+
        "xmlns:search='http://marklogic.com/appservices/search'>"+
      "<search:constraint name='industry'>"+
        "<search:value>"+
          "<search:element name='industry' ns=''/>"+
        "</search:value>"+
      "</search:constraint>"+
  "</search:options>";

確かに、JAXB、JDOM、ファイル、またはその他のツールを使用して XML を作成できますが、私の個人的な意見では、コード内のリソース ファイルにクエリを格納することに依拠しています。これ自体は悪いことではありませんが、慎重に検討すると、コード メンテナンスの悪夢につながる可能性があります。

さらに、サーバーで REST を介してこれらのオプションを永続化する必要があるという事実は、コード ベースで動作することを意図したすべてのデータベース インスタンスとオプションを同期する必要がある可能性があるため、これが必須である場合の潜在的な問題のレイヤーをもう 1 つ導入します。

そのため、Marklogic の開発者が耳を傾けているのであれば、Java クライアント API は、私が期待していたほど成熟しておらず、文書化されていないと思います。

これまでのところ、2 つのオプションがあります。

1) XCC クエリを文字列ファイルにハードコードし、パラメーター プレースホルダーを使用して、必要なデータを挿入し、XCC セッション経由で取得することができます。または。

2) 名前空間用の XSD ファイルがあるかどうかを確認し、それらから静的 JAXB オブジェクトを作成して、 HibernateまたはQueryDSLhttp://marklogic.com/appservices/searchのようなある種の「基準」クラスを作成します。悲しいことに、MongoDB クエリのいくつかのレベルを既にサポートしていると言わざるを得ません。

みんな、本当に、QueryDSL のようなある種の流暢なクエリ機能を Marklogic に持ち込み、このRube Goldberg クエリ マシンを取り除きます。

更新 2:これは ML7 で対処される可能性があるようです。楽しみにしています。

ありがとう!

4

1 に答える 1

4

背景: Java API は REST API のレイヤーです 検索 API のレイヤーは cts:search のレイヤーです

このクエリは Search API で表現できます。

Java API を使用すると、クエリ オプションと構造化クエリを RawCombinedQueryDefinition として使用して検索できます。

つまり、「ROLE_SYS_ADMIN」の bfa:appAccess/@appRole に対する値制約クエリを含む bfa:AppUser の要素クエリを検索することもできます。

XPath は便利ですが、クエリ式に精通して、データベースの能力と柔軟性を十分に理解することをお勧めします。

更新 1:

考慮すべき点がいくつかあります。

  • Search API のクエリには、クエリ (Google スタイルの文字列検索、JSON または XML 構造化検索のいずれかで表現) とクエリ オプションの 2 つの部分があります。StructuredQueryBuilder は、構造化検索を構築します。QueryOptionsBuilder は、クエリ オプションのみを作成しました。

  • ML 6.0-3 では、REST API で複合検索のサポートが導入されました。これにより、1 つの要求で両方の部分が提供されます。Java API は、RawCombinedQueryDefinition クラスを通じて、このような要求のサポートを追加しました。

  • ML7 は構造化検索を拡張して、構造化検索を使用したクエリ オプションの必要性を削減または排除します。StructuredQueryBuilder は ML7 で強化され、構造化検索の新機能をサポートします。ML7 では、クエリ オプションを必要とせずに、StructuredQueryBuilder で完全に上記のサンプル クエリを記述できるようになります。

  • クエリ オプションを構築するコードを QueryOptionsBuilder および JDOM または XOM と比較すると、ビルダーでの LOC の利点はほとんどわかりませんでした。

  • クエリ オプションを文字列にハードコーディングする必要はありません。懸念事項を分離するために、ファイルまたは他の多くのソースから JSON または XML クエリ オプションを読み取ることができます。( http://docs.marklogic.com/javadoc/client/com/marklogic/client/io/marker/QueryOptionsReadHandle.htmlマーカー インターフェースの実装を参照してください。)

  • クエリ オプションは、実行可能コードの代わりに宣言を提供します。類似点は、SPL ファイルではなく、Spring 構成ファイルです。

ところで、JAXB は Java クラスをソースとする設計には優れていますが、複雑な XML スキーマをソースとする設計には JAXB は非常に厄介な場合があります。検索スキーマは、XML スキーマの強力な機能を利用します。この方法を検討したところ、JAXB はクエリ オプションへのインターフェイスの提供に役立たないという結論に達しました。

于 2013-08-28T20:12:38.193 に答える