深入学习Gremlin(18):随机过滤与注入

第18期 Gremlin Steps:

sample()coin()constant()inject()

本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据。

tinkerpop关系图

上一期:深入学习Gremlin(17):待添加

随机过滤说明

Gremlin支持对遍历器(traversal)上的结果进行采样或者做随机过滤。

  • sample: 接受一个整数值,从前一步的遍历器中采样(随机)出最多指定数目的结果;
  • coin: 字面意思是抛硬币过滤,接受一个浮点值,该浮点值表示硬币出现正面的概率。coin Step 对前一步的遍历器中的每个元素都抛一次硬币,出现正面则可以通过,反面则被拦截。

sampleStep后能接上byStep,能以指定的属性为判断依据进行随机过滤。

注入说明

Gremlin允许在遍历器中注入一些默认值或自定义值,比如在分支 Step 中给 else 路径的元素一个默认值,又或者在遍历器过程中人为地加上一些额外的元素。

Inject Step
  • constant: 通常用在choosecoalesceStep中做辅助输出,为那些不满足条件的元素提供一个默认值;
  • inject: 能够在流(遍历器)的任何位置注入与当前遍历器同输出类型的对象,当然,也可以作为流的起始 Step 产生数据;

inject只是在查询过程中添加一些额外的元素,并没有把数据真正地插入到图中

实例讲解

下面通过实例来深入理解每一个操作。

  1. Step sample()

    示例1:

    // 从所有顶点的出边中随机选择2条
    g.V().outE().sample(2)
    

    由于sample是随机采样,所以运行结果每次都可能不一样。另外,sample(n)表示最多采样n个,如果上一步不够n个元素自然结果是会小于n的。

    示例2:

    // 从所以顶点的“name”属性中随机选取3个
    g.V().values('name').sample(3)
    

    示例3:

    // 从所有的“person”中根据“age”随机选择3个
    g.V().hasLabel('person').sample(3).by('age')
    

    示例4:与local联合使用做随机漫游(从某个顶点出发,随机选一条边,走到边上的邻接点;再以该点为起点,继续随机选择边,走到邻接点...)

    //  从顶点“HugeGraph”出发做3次随机漫游
    g.V('3:HugeGraph')
     .repeat(local(bothE().sample(1).otherV()))
     .times(3)
     .path()
    

第1次:从“HugeGraph”沿着“Szhoney>2>>S3:HugeGraph”走到“zhoney”
第2次:从“zhoney”沿着“Sjaveme>1>>Szhoney”走到“javeme”
第3次:从“javeme”沿着“Sjaveme>1>>Slinary”走到“linary”

  1. Step coin()

    示例1:

    // 每个顶点按0.5的概率过滤
    g.V().coin(0.5)
    

    这一次输出了5个顶点,而总共是有12个顶点的,为什么不是输出6个呢?学过概率论的应该都知道,不解释。我又多执行了两次,输出顶点数分别是5和7。

    示例2:

    // 每个顶点按0.0的概率过滤
    g.V().coin(0.0)
    

    示例3:

    // 每个顶点按1.0的概率过滤
    g.V().coin(1.0).count()
    

    避免输出太长,加上count

  2. Step constant()

    示例1:

    // 输出所有“person”类顶点的“name”属性,否则输出“inhuman”(非人类)
    g.V().choose(hasLabel('person'),
                 values('name'),
                 constant('inhuman'))
    

    示例2:

    // 与示例1功能相同,使用“coalesce”Step 实现
    g.V().coalesce(hasLabel('person').values('name'),
                   constant('inhuman'))
    
  3. Step inject()

    示例1:

    // 给顶点“HugeGraph”的作者添加一个叫“Tom”的人
    g.V('3:HugeGraph').in('created').values('name').inject('Tom') 
    

    示例2:

    // 在示例1的基础上计算每个元素的长度(“name”属性值的长度)
    g.V('3:HugeGraph').in('created').values('name').inject('Tom')
     .map {it.get().length()} 
    

    可以看到,注入的元素“Tom”与原生的元素一样参与了计算

    示例3:

    // 在示例2的基础上计算走过的路径
    g.V('3:HugeGraph').in('created').values('name').inject('Tom')
     .map {it.get().length()}.path()
    

    这里又能看出注入元素“Tom”与原生的元素的区别,由于“Tom”是在获取“name”属性这一步时才注入的,所以之前的从顶点“HugeGraph”出发,获取其“created”的入顶点这两步“Tom”是没有的。

    示例4:

    // 使用inject创建出两个元素(顶点的id),并使用该元素作为id获取顶点及其属性“name”
    inject('javeme', 'linary', 'zhoney').map {g.V(it.get()).next()}.values('name')
    
    // 使用inject创建出一个“person”(顶点label),并使用该元素作为label获取顶点及其属性“name”
    inject('person').flatMap {g.V().hasLabel(it.get())}.values('name')
    

下一期:深入学习Gremlin(19):待添加

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,652评论 18 139
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,451评论 0 13
  • 第10期 Gremlin Steps: is()、and()、or()、not() 本系列文章的Gremlin示例...
    苏黎世黄昏阅读 2,191评论 0 1
  • 趁鸟妈妈不在,我赶紧偷拍了几张,满足了一下窥私欲!
    李克富阅读 2,301评论 12 39
  • 春天天气这么好,不能总是宅在家。 要去欣赏感受春天。 听着红楼梦59回正好也在讲春天。 回到家把拍的照片转成手绘。...
    阳光贝拉阅读 315评论 0 4