翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Gremlin クエリでの Neptune フルテキスト検索の使用
NeptuneSearchStep
は、Neptune ステップに変換されない Gremlin トラバーサル部分に対してフルテキスト検索クエリを有効にします。たとえば、次のようなクエリを考えてみます。
g.withSideEffect("Neptune#fts.endpoint", "
your-es-endpoint-URL
") .V() .tail(100) .has("name", "Neptune#fts mark*") <== # Limit the search on name
このクエリは、Neptune で次の最適化されたトラバーサルに変換されます。
Neptune steps: [ NeptuneGraphQueryStep(Vertex) { JoinGroupNode { PatternNode[(?1, <~label>, ?2, <~>) . project distinct ?1 .], {estimatedCardinality=INFINITY} }, annotations={path=[Vertex(?1):GraphStep], maxVarId=4} }, NeptuneTraverserConverterStep ] + not converted into Neptune steps: [NeptuneTailGlobalStep(100), NeptuneTinkerpopTraverserConverterStep, NeptuneSearchStep { JoinGroupNode { SearchNode[(idVar=?3, query=mark*, field=name) . project ask .], {endpoint=your-OpenSearch-endpoint-URL} } JoinGroupNode { SearchNode[(idVar=?3, query=mark*, field=name) . project ask .], {endpoint=your-OpenSearch-endpoint-URL} } }]
以下に、エアルートデータに対する Gremlin クエリの例を示します。
Gremlin の基本的な大文字と小文字を区別しない match
クエリ
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'match') .V().has("city","Neptune#fts dallas") ==>v[186] ==>v[8]
Gremlin match
クエリ
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'match') .V().has("city","Neptune#fts southampton") .local(values('code','city').fold()) .limit(5) ==>[SOU, Southampton]
Gremlin fuzzy
クエリ
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .V().has("city","Neptune#fts allas~").values('city').limit(5) ==>Dallas ==>Dallas ==>Walla Walla ==>Velas ==>Altai
Gremlin query_string
fuzzy クエリ
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'query_string') .V().has("city","Neptune#fts allas~").values('city').limit(5) ==>Dallas ==>Dallas
Gremlin query_string
正規表現クエリ
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'query_string') .V().has("city","Neptune#fts /[dp]allas/").values('city').limit(5) ==>Dallas ==>Dallas
Gremlin ハイブリッドクエリ
このクエリでは、Neptune 内部インデックスと OpenSearch インデックスが同じクエリで使用されます。
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .V().has("region","GB-ENG") .has('city','Neptune#fts L*') .values('city') .dedup() .limit(10) ==>London ==>Leeds ==>Liverpool ==>Land's End
シンプルな Gremlin フルテキスト検索の例
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .V().has('desc','Neptune#fts regional municipal') .local(values('code','desc').fold()) .limit(100) ==>[HYA, Barnstable Municipal Boardman Polando Field] ==>[SPS, Sheppard Air Force Base-Wichita Falls Municipal Airport] ==>[ABR, Aberdeen Regional Airport] ==>[SLK, Adirondack Regional Airport] ==>[BFD, Bradford Regional Airport] ==>[EAR, Kearney Regional Airport] ==>[ROT, Rotorua Regional Airport] ==>[YHD, Dryden Regional Airport] ==>[TEX, Telluride Regional Airport] ==>[WOL, Illawarra Regional Airport] ==>[TUP, Tupelo Regional Airport] ==>[COU, Columbia Regional Airport] ==>[MHK, Manhattan Regional Airport] ==>[BJI, Bemidji Regional Airport] ==>[HAS, Hail Regional Airport] ==>[ALO, Waterloo Regional Airport] ==>[SHV, Shreveport Regional Airport] ==>[ABI, Abilene Regional Airport] ==>[GIZ, Jizan Regional Airport] ==>[USA, Concord Regional Airport] ==>[JMS, Jamestown Regional Airport] ==>[COS, City of Colorado Springs Municipal Airport] ==>[PKB, Mid Ohio Valley Regional Airport]
'+' と '-' 演算子で query_string
を使用した Gremlin クエリ
query_string
クエリタイプはデフォルトの simple_query_string
タイプのように寛容ではありませんが、より正確なクエリが可能です。以下の最初のクエリは query_string
を使用し、2 番目のクエリはデフォルト simple_query_string
を使用します。
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'query_string') . V().has('desc','Neptune#fts +London -(Stansted|Gatwick)') .local(values('code','desc').fold()) .limit(10) ==>[LHR, London Heathrow] ==>[YXU, London Airport] ==>[LTN, London Luton Airport] ==>[SEN, London Southend Airport] ==>[LCY, London City Airport]
以下の例では、simple_query_string
は '+' と '-' 演算子を静かに無視しています。
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .V().has('desc','Neptune#fts +London -(Stansted|Gatwick)') .local(values('code','desc').fold()) .limit(10) ==>[LHR, London Heathrow] ==>[YXU, London Airport] ==>[LGW, London Gatwick] ==>[STN, London Stansted Airport] ==>[LTN, London Luton Airport] ==>[SEN, London Southend Airport] ==>[LCY, London City Airport] ==>[SKG, Thessaloniki Macedonia International Airport] ==>[ADB, Adnan Menderes International Airport] ==>[BTV, Burlington International Airport]
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'query_string') .V().has('desc','Neptune#fts +(regional|municipal) -(international|bradford)') .local(values('code','desc').fold()) .limit(10) ==>[CZH, Corozal Municipal Airport] ==>[MMU, Morristown Municipal Airport] ==>[YBR, Brandon Municipal Airport] ==>[RDD, Redding Municipal Airport] ==>[VIS, Visalia Municipal Airport] ==>[AIA, Alliance Municipal Airport] ==>[CDR, Chadron Municipal Airport] ==>[CVN, Clovis Municipal Airport] ==>[SDY, Sidney Richland Municipal Airport] ==>[SGU, St George Municipal Airport]
AND
および OR
演算子を使用した Gremlin query_string
クエリ
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'query_string') .V().has('desc','Neptune#fts (St AND George) OR (St AND Augustin)') .local(values('code','desc').fold()) .limit(10) ==>[YIF, St Augustin Airport] ==>[STG, St George Airport] ==>[SGO, St George Airport] ==>[SGU, St George Municipal Airport]
Gremlin term
クエリ
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'term') .V().has("SKU","Neptune#fts ABC123DEF9") .local(values('code','city').fold()) .limit(5) ==>[AUS, Austin]
Gremlin prefix
クエリ
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'prefix') .V().has("icao","Neptune#fts ka") .local(values('code','icao','city').fold()) .limit(5) ==>[AZO, KAZO, Kalamazoo] ==>[APN, KAPN, Alpena] ==>[ACK, KACK, Nantucket] ==>[ALO, KALO, Waterloo] ==>[ABI, KABI, Abilene]
Neptune Gremlinでの Lucene 構文の使用
Neptune Gremlin では、Lucene クエリ構文を使用して非常に強力なクエリを作成することもできます。Lucene 構文は OpenSearch の query_string
クエリでのみサポートされていることに注意してください。
次のデータを想定します。
g.addV("person") .property(T.id, "p1") .property("name", "simone") .property("surname", "rondelli") g.addV("person") .property(T.id, "p2") .property("name", "simone") .property("surname", "sengupta") g.addV("developer") .property(T.id, "p3") .property("name", "simone") .property("surname", "rondelli")
queryType
が query_string
のときに呼び出される Lucene 構文を使用すると、名前と姓で以下のようにこのデータを検索できます。
g.withSideEffect("Neptune#fts.endpoint", "es_endpoint") .withSideEffect("Neptune#fts.queryType", "query_string") .V() .has("*", "Neptune#fts predicates.name.value:simone AND predicates.surname.value:rondelli") ==> v[p1], v[p3]
上記の has()
ステップでは、フィールドが "*"
に置き換えられていることに注意してください)。実際には、そこに配置された値は、クエリ内でアクセスするフィールドによって上書きされます。データモデルが構造化されているため、predicates.name.value,
を使用して名前フィールドにアクセスします。
次のように名前、姓、ラベルで検索できます。
g.withSideEffect("Neptune#fts.endpoint", getEsEndpoint()) .withSideEffect("Neptune#fts.queryType", "query_string") .V() .has("*", "Neptune#fts predicates.name.value:simone AND predicates.surname.value:rondelli AND entity_type:person") ==> v[p1]
データモデルが構造化されているため、再び entity_type
を使用してラベルにアクセスします。
ネスト条件を含めることもできます。
g.withSideEffect("Neptune#fts.endpoint", getEsEndpoint()) .withSideEffect("Neptune#fts.queryType", "query_string") .V() .has("*", "Neptune#fts (predicates.name.value:simone AND predicates.surname.value:rondelli AND entity_type:person) OR predicates.surname.value:sengupta") ==> v[p1], v[p2]
Modern TinkerPop グラフを挿入する
g.addV('person').property(T.id, '1').property('name', 'marko').property('age', 29) .addV('personr').property(T.id, '2').property('name', 'vadas').property('age', 27) .addV('software').property(T.id, '3').property('name', 'lop').property('lang', 'java') .addV('person').property(T.id, '4').property('name', 'josh').property('age', 32) .addV('software').property(T.id, '5').property('name', 'ripple').property('lang', 'java') .addV('person').property(T.id, '6').property('name', 'peter').property('age', 35) g.V('1').as('a').V('2').as('b').addE('knows').from('a').to('b').property('weight', 0.5f).property(T.id, '7') .V('1').as('a').V('3').as('b').addE('created').from('a').to('b').property('weight', 0.4f).property(T.id, '9') .V('4').as('a').V('3').as('b').addE('created').from('a').to('b').property('weight', 0.4f).property(T.id, '11') .V('4').as('a').V('5').as('b').addE('created').from('a').to('b').property('weight', 1.0f).property(T.id, '10') .V('6').as('a').V('3').as('b').addE('created').from('a').to('b').property('weight', 0.2f).property(T.id, '12') .V('1').as('a').V('4').as('b').addE('knows').from('a').to('b').property('weight', 1.0f).property(T.id, '8')
文字列フィールド値で並べ替える例
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'query_string') .withSideEffect('Neptune#fts.sortOrder', 'asc') .withSideEffect('Neptune#fts.sortBy', 'name') .V().has('name', 'Neptune#fts marko OR vadas OR ripple')
非文字列フィールド値で並べ替える例
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'query_string') .withSideEffect('Neptune#fts.sortOrder', 'asc') .withSideEffect('Neptune#fts.sortBy', 'age.value') .V().has('name', 'Neptune#fts marko OR vadas OR ripple')
ID フィールド値で並べ替える例
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'query_string') .withSideEffect('Neptune#fts.sortOrder', 'asc') .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.entity_id') .V().has('name', 'Neptune#fts marko OR vadas OR ripple')
ラベル付けフィールド値で並べ替える例
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'query_string') .withSideEffect('Neptune#fts.sortOrder', 'asc') .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.entity_type') .V().has('name', 'Neptune#fts marko OR vadas OR ripple')
document_type
フィールド値による並べ替えの例
g.withSideEffect("Neptune#fts.endpoint", "
your-OpenSearch-endpoint-URL
") .withSideEffect('Neptune#fts.queryType', 'query_string') .withSideEffect('Neptune#fts.sortOrder', 'asc') .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.document_type') .V().has('name', 'Neptune#fts marko OR vadas OR ripple')