2

長い投稿で申し訳ありませんが、私が探しているものについての誤解を避けたいです:)

私は現在、グラフ データベースを発見し、bulbflow/neo4j を少し試しています。したがって、ほとんどのリクエストにgremlinを使用しようとしていますが、必要なリクエストが実行可能かどうかはわかりません. このようなユースケースでグラフデータベースを使用しようとすることは間違っているかもしれないので、私が正しい道を進んでいるかどうかを教えてください。

最初に、少しコンテキストを提供させてください。

私は、C コードを生成する DSL 言語用のコンパイラーである初期段階のオープンソース プロジェクトに取り組んでいます。現在、多くの理由 (言語、再設計、コミュニティへの開放など...) のために、すべてを Python で書き直すことを計画しています。コンパイラには、コンパイルされたインターフェイスとテンプレートのキャッシュと呼ばれるものが含まれています。インターフェイスはテンプレートを記述し、各テンプレートは構成 (インターフェイスによって記述された変数に関連付けられた型指定された値のリスト) に関連付けられます。

私が構築したいリクエストの目的は、入力構成に応じて単一のテンプレート実装を選択することです (実際にはコンパイラの生成メカニズムで使用されます)。最後に、この「キャッシュ」内で見つけることができる要素に単一性を提供するために、探している単一の要素を (可能であれば) gremlin を介して直接要求できるようにしたいと考えています。現在、Python コードでこの構成を手動で一致させていますが、gremlin 内で直接実行できるかどうかを知りたいです。

-

それでは、私のユース ケースのサンプル グラフを定義しましょう。3 種類の頂点があります。

  1. Def (定義) には、「署名」と呼ばれる文字列プロパティが含まれています。これは、実際には、このノードによって定義されたテンプレートの署名です。
  2. 元のソースとプリコンパイル済みファイルへのパスである 2 つのプロパティを含む Impl (実装)。
  3. Var (変数)。変数のシグネチャである String プロパティを含みます。

次に、いくつかの種類のエッジ:

  • Def -> impl_by -> Impl (1 つの定義に対して複数の実装が存在する可能性があり、プロパティは含まれません)
  • Impl -> select_by -> Var (実装は、構成変数の値に対する制約によって選択される場合があります。この型の各エッジには、実際には型、値、および制約 (比較演算子) の 3 つのプロパティが含まれます)

selected_by エッジ (またはリレーションシップ、bulflow の語彙に従う) は、選択制約を記述し、次のプロパティを持ちます。

  • val (元の実装の変数に関連付けられた値)
  • op (制約が有効かどうかを判断するために行う比較の種類を示す比較演算子)

これは、次のようなグラフとして変換されます (このグラフでは、selected_by エッジから型を省略します)。

              -- select_by { value="John", op="="}  ---------
              |                                              \
    (1)--Impl--- select_by { value=12, op=">"}      ------    \
    |                                                     \    \
    |                                                      \    |- Var("name")
    |         |- select_by { value="Peter", op="="} -----------/
Def (2)--Impl--                                              \/
    |         |- select_by { value=15, op="<"}      ----     /\
    |                                                   \   /  \
    |                                                    |-/----|--- Var("ver")
    (3)--Impl--- select_by { value="Kat", op="!="}  ------/    /
            |                                                 /
            |--- select_by { value=9, op=">"}       ---------/

私がやりたいことは、Vars との関係に応じて 1 つ (または複数) の Impl を選択することです。次のような構成があるとします。

構成 1:

variable="name", value="Peter"
variable="ver", value=16

これは、Peter != Kat AND 16 > 9 から Impl(3) を選択しますが、Peter != John から Impl(1) も、16 !< 15 から Impl(2) も選択しません。

私は複数のレベルでブロックされていたので、これが実現可能かどうか疑問に思い始めていました:

  • そのような引数 (構成) を gremlin スクリプトに与える方法が見つかりませんでした
  • 出力エッジの条件に基づいて Impl を選択する方法が見つかりませんでした。

これがあまり混乱しないことを願っています。

乾杯、そしてありがとう!

編集:

バックトラッキングとフィルターを繰り返し使用することで、リクエストの一部を機能させることができました。リクエスト (X は開始頂点、VALUE は照合する値、NAME は照合する変数の名前) は次のようになります。

リクエストの根拠:

g.v(X).out('impl').as('implem')

VALUE/NAME の組み合わせごとにこの部分を繰り返します。

.out('select_by').filter{it.value=='VAL‌​UE'}
.inV('select_by').filter{it.name=='NAME'}
.back('implem')

現在欠けている唯一のことは、select_by エッジの「op」プロパティを使用して、使用するフィルターを構築する方法を決定する方法がわからないことです。たとえば、構成を正確に一致させたい場合が 3 つあります (したがって、この要求のように「op」プロパティを無視します)。ただし、「op」プロパティを考慮に入れたい場合もあります。関連するコンパレーターをフィルターで使用します。

それを行う方法はありますか?(または、別の質問を投稿する必要がありますか?)

4

0 に答える 0