質問を投稿してから私が見つけたものは次のとおりです。
Hibernateセッションを具体的に3倍にする既存のツールはありません。自分で実装するには、おそらくGraphBaseをベースとして、またはStageGeneratorを使用してGraphを実装する必要があります。したがって、質問に対する答えは「1つではない」ということなので、それをどのように実装するかを検討しました。
すでにセッションにあるオブジェクトを3倍にする(つまり、以前のクエリによってすでにアクセスされている)か、データベースへのアクセスに依存するか、またはその両方を行うかを決定する必要があります。データベースにアクセスする場合は、オブジェクト全体をロードしてセッションにアタッチするか、プロジェクションを使用して追加のラウンドトリップを犠牲にしてヒープに追加のデータを取り込むのを節約するかを決定する必要もあります。
グラフの使用は、推論をサポートするために明らかに不可欠ですが、ARQのStageGeneratorを使用するよりも遅くなります。これは、一連のトリプルパターンをクエリできるためです。ただし、これにより、常に少し柔軟性がないように見えるSPARQLを使用することが不可欠になります。
これまでのところ、最適なソリューションは次のように見えます。
- (おそらく読み取り専用の)グラフを実装します-「HibernateGraph」と言います
- HibernateGraphにHibernatePersistenceContextオブジェクトを検査させ、カスタムイテレーターの先頭でトリプルを返します。
- イテレータの有効期限が切れると、Criteriaインターフェイスを使用してデータベースからデータのページをロードします。
- 既知の述語URIを持つクエリの場合、URIを列にマップし、厳密な射影を使用します。それ以外の場合は、オブジェクト全体をロードしてゲッターを反復処理し、ゲッター名をURIにマッピングします。
- その他の場合は、単純なスキームを使用してマップします。たとえば、各サブジェクトのhttp:// root / url / instances / EntityName/idなど
- ヘルパーオブジェクトを作成して、カスタムStageGeneratorでSPARQLを実行できるようにします。
- StageGeneratorは、組み込みのStageGeneratorをラップする必要があります。
- カスタムステージジェネレーターでは、HibernateGraph以外のグラフに対するクエリを、組み込みのStageGeneratorへのチェーンの上位に渡します。
- また、最適化されたソリューションがないトリプルパターンのセット、たとえば1つのパターンのセットをスキップします。
- 最適化されたクエリを実行できる場合は、適切なCriteria関数を実行し、前と同じようにセルごとに結果をトリプルにマップします。
OpExecutorと呼ばれる別のSPIがあり、これはFILTER解決をデータベースにプッシュするのに役立つ可能性があるため、パフォーマンスがさらに向上します。
現時点では、これをサイドプロジェクトとして採用しており、LGPLソフトウェアとしてリリースする可能性があります。