2017-12-10 25 views
3

ワイルドカード検索の一種で頂点を検索しようとしています。 SQLの場合は、 "名前は '%abc%'のようになります。" GremlinグラフのトラバーサルもSQLクエリーもそれをサポートしていません。グレムリングラフAPIを使用したazure cosmos dbでのワイルドカードまたは「LIKE」検索

ユースケースは、1:n依存関係をフィルタリングすることです。 "名前が 'サム'を含むすべての顧客を表示してください。これは、非常に基本的でSQLで簡単です。これは全体的な全文検索ではなく、この特定の1:n関連性におけるフィルタです。 SQL後

作品:SQLは、(「構文エラー、 'のような' 付近に正しくない構文を)動作しません後

g.V().hasLabel("person").has("name", "Sam") 

:と同等です

SELECT * FROM g 
    where (g.label = "person" and g.name[0]._value = 'Sam') 

SELECT * FROM g 
    where (g.label = "person" and g.name[0]._value like 'Sam') 

Gremlinの "filter"ステップでラムダを使用しようとすると、エラーも発生します。

この種の検索では、UDFなどのストアドプロシージャを記述することをお勧めしますか?その場合、どのようにインデックス処理が行われますか?選択肢はありますか?たくさん

+0

解決策に近づきましたか?私はフィルタを探していたが、クロージャがサポートされていないようだ –

答えて

0

おかげで私はグレムリンのアズールの実施に関するこのレンガ壁の制限をヒットし、ファジーマッチングすぎ

あなたはこの段階で取ることができますアプローチのカップルが、最善の解決策があります。あなたの目標と制約に依存します。これらがいくつかのインスピレーションを構成することを願っています。

これを進める方法の1つは、リポジトリ/データアクセスレイヤーにキャッシングレイヤーを実装し、コードを使用してインメモリコレクションをクエリすることです。

別のオプションは、あなたが検索されるパターンの複雑さに依存して(有効精度レベルに下降する)セグメントにダウン名を破壊し

例えば名前の部分に自由に検索することです

名=サム・スミス

プロパティ:

ファーストネーム=サム、

FirstNameInitial = S、

姓=スミス、

LastnameInitial = S

イニダダTA

g.addV('Person').property('Firstname', 'Sam').property('FirstnameInitial', 'S').property('Lastname', 'Smith').property('LastnameInitial', 'S') 

問合せデータ

g.V().has('label', 'Person').has('Firstname', 'Sa').has('Lastname', 'Smit').fold().coalesce(
    unfold(), 
    g.V().has('label', 'Person').has('FirstnameInitial', 'S').has('Lastname', 'Smit'), 
    g.V().has('label', 'Person').has('Firstname', 'Sam').has('LastnameInitial', 'S'), 
    g.V().has('label', 'Person').has('FirstnameInitial', 'S').has('LastnameInitial', 'S') 
) 

合体カンマが最初の非空集合を返すために、用語を分離評価します。この方法をfoldとunfoldと組み合わせて使用​​すると、最初の単語(.fold()。coalesce()の前のすべてが coalesceステートメントのunfold())を最初に返します。カンマで区切られたクエリを順番に実行します。

このようにして、より具体的に検索を開始し、より一般的な検索にフォールバックする可能性があります。明らかに、あなたは概念をとって、「Lastname2Initials」、「Lastname3Initials」などのようなものを含むように進化させることができます

あなたがあなたに役立つことを願っています。