Verwenden der Neptune-Volltextsuche in Gremlin-Abfragen - Amazon Neptune

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden der Neptune-Volltextsuche in Gremlin-Abfragen

NeptuneSearchStep aktiviert Volltextsuchabfragen für den Teil eines Gremlin-Traversals, der nicht in Neptune-Schritte konvertiert wird. Sehen Sie sich zum Beispiel folgende Abfrage an:

g.withSideEffect("Neptune#fts.endpoint", "your-es-endpoint-URL") .V() .tail(100) .has("name", "Neptune#fts mark*") <== # Limit the search on name

Diese Abfrage wird in die folgende optimierte Traversale in Neptune konvertiert:

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} } }]

Die folgenden Beispiele sind Gremlin-Abfragen anhand von Flugstreckendaten:

Grundlegende Gremlin-match-Übereinstimmungsabfrage mit Groß- und Kleinschreibung

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-Abfrage

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-Abfrage

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-Abfrage

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-Abfrage mit regulären Ausdrücken

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-Hybridabfrage

Diese Abfrage verwendet einen internen Neptune-Index und den OpenSearch-Index in derselben Abfrage.

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

Einfaches Beispiel für eine Gremlin-Volltextsuche

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]

Gremlin-Abfrage mit query_string mit den Operatoren „+“ und „-“

Obwohl der query_string-Abfragetyp viel weniger strenger ist als der standardmäßige simple_query_string-Typ, ermöglicht er genauere Abfragen. Bei der ersten der folgenden Abfragen wird query_string verwendet. Bei der zweiten der standardmäßige 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]

Beachten Sie, wie simple_query_string in den folgenden Beispielen die Operatoren „+“ und „-“ unbemerkt ignoriert:

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]

Gremlin-query_string-Abfrage mit den Operatoren AND und OR

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-Abfrage

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-Abfrage

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]

Verwenden der Lucene-Syntax in Neptune Gremlin

In Neptune Gremlin können Sie auch sehr leistungsstarke Abfragen mit der Lucene-Abfragesyntax schreiben. Die Lucene-Syntax wird nur für query_string-Abfragen in OpenSearch unterstützt.

Setzen Sie die folgenden Daten voraus:

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")

Mit der Lucene-Syntax, die aufgerufen wird, wenn der queryType auf query_string eingestellt ist, können Sie diese Daten wie folgt nach Vor- und Nachnamen durchsuchen:

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]

Beachten Sie, dass im obigen Schritt has() das Feld durch "*" ersetzt wird). Tatsächlich wird jeder dort platzierte Wert von den Feldern außer Kraft gesetzt, auf die Sie innerhalb der Abfrage zugreifen. Sie greifen mit predicates.name.value, auf das Namensfeld zu, da das Datenmodell so strukturiert ist.

Sie können wie folgt nach Name, Nachname und Bezeichnung suchen:

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]

Auf die Bezeichnung wird mit entity_type zugegriffen, da das Datenmodell so strukturiert ist.

Sie können auch Verschachtelungsbedingungen einschließen:

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]

Einfügen eines modernen TinkerPop-Graphen

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')

Beispiel für eine Sortierung nach einem Zeichenfolgen-Feldwert

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')

Beispiel für eine Sortierung nach einem Nicht-Zeichenfolgen-Feldwert

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')

Beispiel für eine Sortierung nach einem ID-Feldwert

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')

Beispiel für eine Sortierung nach einem Etikett-Feldwert

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')

Beispiel für eine Sortierung nach einem document_type-Feldwert

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')