blob: d0dee12a77bbae165d3181289c678c84589343c6 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
Feature: Step - match()
Scenario: g_V_valueMap_matchXa_selectXnameX_bX
Given the modern graph
And the traversal of
"""
g.V().valueMap().match(__.as("a").select("name").as("b"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":{"name":["marko"],"age":[29]},"b":["marko"]}] |
| m[{"a":{"name":["vadas"],"age":[27]},"b":["vadas"]}] |
| m[{"a":{"name":["lop"],"lang":["java"]},"b":["lop"]}] |
| m[{"a":{"name":["josh"],"age":[32]},"b":["josh"]}] |
| m[{"a":{"name":["ripple"],"lang":["java"]},"b":["ripple"]}] |
| m[{"a":{"name":["peter"],"age":[35]},"b":["peter"]}] |
Scenario: g_V_matchXa_out_bX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out().as("b"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[lop]"}] |
| m[{"a":"v[marko]","b":"v[vadas]"}] |
| m[{"a":"v[marko]","b":"v[josh]"}] |
| m[{"a":"v[josh]","b":"v[ripple]"}] |
| m[{"a":"v[josh]","b":"v[lop]"}] |
| m[{"a":"v[peter]","b":"v[lop]"}] |
Scenario: g_V_matchXa_out_bX_selectXb_idX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out().as("b")).select("b").by(T.id)
"""
When iterated to list
Then the result should be unordered
| result |
| d[3].i |
| d[2].i |
| d[4].i |
| d[5].i |
| d[3].i |
| d[3].i |
Scenario: g_V_matchXa_knows_b__b_created_cX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out("knows").as("b"),
__.as("b").out("created").as("c"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[josh]", "c":"v[ripple]"}] |
| m[{"a":"v[marko]","b":"v[josh]", "c":"v[lop]"}] |
Scenario: g_V_matchXb_created_c__a_knows_bX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("b").out("created").as("c"),
__.as("a").out("knows").as("b"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[josh]", "c":"v[ripple]"}] |
| m[{"a":"v[marko]","b":"v[josh]", "c":"v[lop]"}] |
Scenario: g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_cX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out("created").as("b"),
__.as("b").in("created").as("c")).where("a", P.neq("c")).select("a", "c")
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","c":"v[josh]"}] |
| m[{"a":"v[marko]","c":"v[peter]"}] |
| m[{"a":"v[josh]","c":"v[marko]"}] |
| m[{"a":"v[josh]","c":"v[peter]"}] |
| m[{"a":"v[peter]","c":"v[marko]"}] |
| m[{"a":"v[peter]","c":"v[josh]"}] |
Scenario: g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("d").in("knows").as("a"),
__.as("d").has("name", "vadas"),
__.as("a").out("knows").as("b"),
__.as("b").out("created").as("c"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[josh]","c":"v[ripple]","d":"v[vadas]"}] |
| m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]","d":"v[vadas]"}] |
Scenario: g_V_matchXa_created_lop_b__b_0created_29_c__c_whereXrepeatXoutX_timesX2XXX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out("created").has("name", "lop").as("b"),
__.as("b").in("created").has("age", 29).as("c"),
__.as("c").where(__.repeat(__.out()).times(2)))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[lop]","c":"v[marko]"}] |
| m[{"a":"v[josh]","b":"v[lop]","c":"v[marko]"}] |
| m[{"a":"v[peter]","b":"v[lop]","c":"v[marko]"}] |
Scenario: g_V_asXaX_out_asXbX_matchXa_out_count_c__b_in_count_cX
Given the modern graph
And the traversal of
"""
g.V().as("a").out().as("b").match(__.as("a").out().count().as("c"), __.as("b").in().count().as("c"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[lop]","c":"d[3].l"}] |
Scenario: g_V_matchXa__a_out_b__notXa_created_bXX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out().as("b"),__.not(__.as("a").out("created").as("b")))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[vadas]"}] |
| m[{"a":"v[marko]","b":"v[josh]"}] |
Scenario: g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXa_b_cX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out("created").has("name", "lop").as("b"),
__.as("b").in("created").has("age", 29).as("c")).where(__.as("c").repeat(__.out()).times(2)).select("a", "b", "c")
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[lop]","c":"v[marko]"}] |
| m[{"a":"v[josh]","b":"v[lop]","c":"v[marko]"}] |
| m[{"a":"v[peter]","b":"v[lop]","c":"v[marko]"}] |
Scenario: g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name
Given the modern graph
And the traversal of
"""
g.V().out().out().match(__.as("a").in("created").as("b"),
__.as("b").in("knows").as("c")).
select("c").out("created").values("name")
"""
When iterated to list
Then the result should be unordered
| result |
| lop |
| lop |
Scenario: g_V_matchXa_knows_b__b_created_c__a_created_cX_dedupXa_b_cX_selectXaX_byXnameX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out("knows").as("b"),
__.as("b").out("created").as("c"),
__.as("a").out("created").as("c")).dedup("a", "b", "c").select("a").by("name")
"""
When iterated to list
Then the result should be unordered
| result |
| marko |
Scenario: g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXa_bX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out("created").as("b"),
__.as("a").repeat(__.out()).times(2).as("b")).select("a", "b")
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[lop]"}] |
Scenario: g_V_notXmatchXa_age_b__a_name_cX_whereXb_eqXcXX_selectXaXX_name
Given the modern graph
And the traversal of
"""
g.V().not(__.match(__.as("a").values("age").as("b"), __.as("a").values("name").as("c")).where("b", P.eq("c")).select("a")).values("name")
"""
When iterated to list
Then the result should be unordered
| result |
| marko |
| vadas |
| lop |
| josh |
| ripple |
| peter |
Scenario: g_V_matchXa_knows_b__andXa_created_c__b_created_c__andXb_created_count_d__a_knows_count_dXXX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out("knows").as("b"),
__.and(__.as("a").out("created").as("c"),
__.as("b").out("created").as("c"),
__.and(__.as("b").out("created").count().as("d"),
__.as("a").out("knows").count().as("d"))))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]","d":"d[2].l"}] |
Scenario: g_V_matchXa_whereXa_neqXcXX__a_created_b__orXa_knows_vadas__a_0knows_and_a_hasXlabel_personXX__b_0created_c__b_0created_count_isXgtX1XXX_selectXa_b_cX_byXidX
Given the modern graph
And the traversal of
"""
g.V().match(__.where("a", P.neq("c")),
__.as("a").out("created").as("b"),
__.or(__.as("a").out("knows").has("name", "vadas"),
__.as("a").in("knows").and().as("a").has(T.label, "person")),
__.as("b").in("created").as("c"),
__.as("b").in("created").count().is(P.gt(1))).select("a", "b", "c").by(T.id)
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":1,"b":3,"c":4}] |
| m[{"a":1,"b":3,"c":6}] |
| m[{"a":4,"b":3,"c":1}] |
| m[{"a":4,"b":3,"c":6}] |
Scenario: g_V_matchXa__a_both_b__b_both_cX_dedupXa_bX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").both().as("b"),
__.as("b").both().as("c")).dedup("a", "b")
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[lop]","c":"v[marko]"}] |
| m[{"a":"v[marko]","b":"v[vadas]","c":"v[marko]"}] |
| m[{"a":"v[marko]","b":"v[josh]","c":"v[ripple]"}] |
| m[{"a":"v[vadas]","b":"v[marko]","c":"v[lop]"}] |
| m[{"a":"v[lop]","b":"v[marko]","c":"v[lop]"}] |
| m[{"a":"v[lop]","b":"v[josh]","c":"v[ripple]"}] |
| m[{"a":"v[lop]","b":"v[peter]","c":"v[lop]"}] |
| m[{"a":"v[josh]","b":"v[ripple]","c":"v[josh]"}] |
| m[{"a":"v[josh]","b":"v[lop]","c":"v[marko]"}] |
| m[{"a":"v[josh]","b":"v[marko]","c":"v[lop]"}] |
| m[{"a":"v[ripple]","b":"v[josh]","c":"v[ripple]"}] |
| m[{"a":"v[peter]","b":"v[lop]","c":"v[marko]"}] |
Scenario: g_V_matchXa_knows_b__b_created_lop__b_matchXb_created_d__d_0created_cX_selectXcX_cX_selectXa_b_cX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out("knows").as("b"),
__.as("b").out("created").has("name", "lop"),
__.as("b").match(__.as("b").out("created").as("d"),
__.as("d").in("created").as("c")).select("c").as("c")).select("a", "b", "c")
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[josh]","c":"v[josh]"}] |
| m[{"a":"v[marko]","b":"v[josh]","c":"v[marko]"}] |
| m[{"a":"v[marko]","b":"v[josh]","c":"v[josh]"}] |
| m[{"a":"v[marko]","b":"v[josh]","c":"v[peter]"}] |
Scenario: g_V_matchXa_knows_b__a_created_cX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out("knows").as("b"),
__.as("a").out("created").as("c"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[vadas]","c":"v[lop]"}] |
| m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]"}] |
Scenario: g_V_matchXwhereXandXa_created_b__b_0created_count_isXeqX3XXXX__a_both_b__whereXb_inXX
Given the modern graph
And the traversal of
"""
g.V().match(__.where(__.and(__.as("a").out("created").as("b"),
__.as("b").in("created").count().is(P.eq(3)))),
__.as("a").both().as("b"),
__.where(__.as("b").in()))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[lop]"}] |
| m[{"a":"v[josh]","b":"v[lop]"}] |
| m[{"a":"v[peter]","b":"v[lop]"}] |
Scenario: g_V_matchXa_outEXcreatedX_order_byXweight_descX_limitX1X_inV_b__b_hasXlang_javaXX_selectXa_bX_byXnameX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").outE("created").order().by("weight", Order.desc).limit(1).inV().as("b"),
__.as("b").has("lang", "java")).select("a", "b").by("name")
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"marko","b":"lop"}] |
| m[{"a":"josh","b":"ripple"}] |
| m[{"a":"peter","b":"lop"}] |
Scenario: g_V_matchXa_both_b__b_both_cX_dedupXa_bX_byXlabelX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").both().as("b"),
__.as("b").both().as("c")).dedup("a", "b").by(T.label)
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[lop]","c":"v[marko]"}] |
| m[{"a":"v[marko]","b":"v[vadas]","c":"v[marko]"}] |
| m[{"a":"v[lop]","b":"v[marko]","c":"v[lop]"}] |
Scenario: g_V_matchXa_created_b__b_0created_aX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out("created").as("b"),
__.as("b").in("created").as("a"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[lop]"}] |
| m[{"a":"v[josh]","b":"v[ripple]"}] |
| m[{"a":"v[josh]","b":"v[lop]"}] |
| m[{"a":"v[peter]","b":"v[lop]"}] |
Scenario: g_V_asXaX_out_asXbX_matchXa_out_count_c__orXa_knows_b__b_in_count_c__and__c_isXgtX2XXXX
Given the modern graph
And the traversal of
"""
g.V().as("a").out().as("b").match(__.as("a").out().count().as("c"),
__.or(__.as("a").out("knows").as("b"),__.as("b").in().count().as("c").and().as("c").is(P.gt(2))))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[marko]","b":"v[lop]","c":"d[3].l"}] |
| m[{"a":"v[marko]","b":"v[vadas]","c":"d[3].l"}] |
| m[{"a":"v[marko]","b":"v[josh]","c":"d[3].l"}] |
Scenario: g_V_matchXa_knows_count_bX_selectXbX
Given the modern graph
And the traversal of
"""
g.V().match(__.as("a").out("knows").count().as("b")).select("b")
"""
When iterated to list
Then the result should be unordered
| result |
| d[2].l |
| d[0].l |
| d[0].l |
| d[0].l |
| d[0].l |
| d[0].l |
Scenario: g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX
Given the grateful graph
And the traversal of
"""
g.V().match(__.as("a").in("sungBy").as("b"),
__.as("a").in("writtenBy").as("c"),
__.as("b").out("writtenBy").as("d"),
__.as("c").out("sungBy").as("d"),
__.as("d").has("name", "Garcia"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[Garcia]","b":"v[CREAM PUFF WAR]","c":"v[CREAM PUFF WAR]","d":"v[Garcia]"}] |
| m[{"a":"v[Garcia]","b":"v[CREAM PUFF WAR]","c":"v[CRYPTICAL ENVELOPMENT]","d":"v[Garcia]"}] |
| m[{"a":"v[Garcia]","b":"v[CRYPTICAL ENVELOPMENT]","c":"v[CREAM PUFF WAR]","d":"v[Garcia]"}] |
| m[{"a":"v[Garcia]","b":"v[CRYPTICAL ENVELOPMENT]","c":"v[CRYPTICAL ENVELOPMENT]","d":"v[Garcia]"}] |
| m[{"a":"v[Grateful_Dead]","b":"v[CANT COME DOWN]","c":"v[DOWN SO LONG]","d":"v[Garcia]"}] |
| m[{"a":"v[Grateful_Dead]","b":"v[THE ONLY TIME IS NOW]","c":"v[DOWN SO LONG]","d":"v[Garcia]"}] |
Scenario: g_V_matchXa_hasXsong_name_sunshineX__a_mapX0followedBy_weight_meanX_b__a_0followedBy_c__c_filterXweight_whereXgteXbXXX_outV_dX_selectXdX_byXnameX
Given the grateful graph
And the traversal of
"""
g.V().match(__.as("a").has("song", "name", "HERE COMES SUNSHINE"),
__.as("a").map(__.inE("followedBy").values("weight").mean()).as("b"),
__.as("a").inE("followedBy").as("c"),
__.as("c").filter(__.values("weight").where(P.gte("b"))).outV().as("d")).
select("d").by("name")
"""
When iterated to list
Then the result should be unordered
| result |
| THE MUSIC NEVER STOPPED |
| PROMISED LAND |
| PLAYING IN THE BAND |
| CASEY JONES |
| BIG RIVER |
| EL PASO |
| LIBERTY |
| LOOKS LIKE RAIN |
Scenario: g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX
Given the grateful graph
And the traversal of
"""
g.V().match(__.as("a").in("sungBy").as("b"),
__.as("a").in("sungBy").as("c"),
__.as("b").out("writtenBy").as("d"),
__.as("c").out("writtenBy").as("e"),
__.as("d").has("name", "George_Harrison"),
__.as("e").has("name", "Bob_Marley"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[Garcia]","b":"v[I WANT TO TELL YOU]","c":"v[STIR IT UP]","d":"v[George_Harrison]","e":"v[Bob_Marley]"}] |
Scenario: g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX
Given the grateful graph
And the traversal of
"""
g.V().match(__.as("a").has("name", "Garcia"),
__.as("a").in("writtenBy").as("b"),
__.as("a").in("sungBy").as("b"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[Garcia]","b":"v[CREAM PUFF WAR]"}] |
| m[{"a":"v[Garcia]","b":"v[CRYPTICAL ENVELOPMENT]"}] |
Scenario: g_V_hasLabelXsongsX_matchXa_name_b__a_performances_cX_selectXb_cX_count
Given the grateful graph
And the traversal of
"""
g.V().hasLabel("song").match(
__.as("a").values("name").as("b"),
__.as("a").values("performances").as("c")).select("b", "c").count()
"""
When iterated to list
Then the result should be ordered
| result |
| d[584].l |
Scenario: g_V_matchXa_followedBy_count_isXgtX10XX_b__a_0followedBy_count_isXgtX10XX_bX_count
Given the grateful graph
And the traversal of
"""
g.V().match(__.as("a").out("followedBy").count().is(P.gt(10)).as("b"),
__.as("a").in("followedBy").count().is(P.gt(10)).as("b")).count()
"""
When iterated to list
Then the result should be ordered
| result |
| d[6].l |
Scenario: g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX
Given the grateful graph
And the traversal of
"""
g.V().match(__.as("a").in("sungBy").as("b"),
__.as("a").in("writtenBy").as("c"),
__.as("b").out("writtenBy").as("d")).
where(__.as("c").out("sungBy").as("d")).
where(__.as("d").has("name", "Garcia"))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[Garcia]","b":"v[CREAM PUFF WAR]","c":"v[CREAM PUFF WAR]","d":"v[Garcia]"}] |
| m[{"a":"v[Garcia]","b":"v[CREAM PUFF WAR]","c":"v[CRYPTICAL ENVELOPMENT]","d":"v[Garcia]"}] |
| m[{"a":"v[Garcia]","b":"v[CRYPTICAL ENVELOPMENT]","c":"v[CREAM PUFF WAR]","d":"v[Garcia]"}] |
| m[{"a":"v[Garcia]","b":"v[CRYPTICAL ENVELOPMENT]","c":"v[CRYPTICAL ENVELOPMENT]","d":"v[Garcia]"}] |
| m[{"a":"v[Grateful_Dead]","b":"v[CANT COME DOWN]","c":"v[DOWN SO LONG]","d":"v[Garcia]"}] |
| m[{"a":"v[Grateful_Dead]","b":"v[THE ONLY TIME IS NOW]","c":"v[DOWN SO LONG]","d":"v[Garcia]"}] |
Scenario: g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__b_followedBy_c__c_writtenBy_d__whereXd_neqXaXXX
Given the grateful graph
And the traversal of
"""
g.V().match(__.as("a").has("name", "Garcia"),
__.as("a").in("writtenBy").as("b"),
__.as("b").out("followedBy").as("c"),
__.as("c").out("writtenBy").as("d"),
__.where("d", P.neq("a")))
"""
When iterated to list
Then the result should be unordered
| result |
| m[{"a":"v[Garcia]","b":"v[CRYPTICAL ENVELOPMENT]","c":"v[DRUMS]","d":"v[Grateful_Dead]"}] |
| m[{"a":"v[Garcia]","b":"v[CRYPTICAL ENVELOPMENT]","c":"v[THE OTHER ONE]","d":"v[Weir]"}] |
| m[{"a":"v[Garcia]","b":"v[CRYPTICAL ENVELOPMENT]","c":"v[WHARF RAT]","d":"v[Hunter]"}] |