Gremlin语言:图遍历语言

三 、新闻结构和java对象赋值

PhoneName:” idol3”

Price:2000

Top:1

 

WatchName:” tcl watch”

Price:1000

Top:1

 

Gremlin简介

Gremlin是Apache TinkerPop
框架下的图遍历语言。Gremlin是一种函数式数据流语言,可以使得用户采用简单的主意表达复杂的习性图(property
graph)的遍历或询问。每一个Gremlin遍历由一各类步骤(大概存在嵌套)组成,每一步都在数据流(data
stream)上进行三个原子操作。

Gremlin包蕴多少个着力的操作:

  • map-step
    对数码流中的对象进行更换;
  • filter-step
    对数据流中的目的就行过滤;
  • sideEffect-step
    对数码流进行总结计算;

以下是Gremlin在局地风貌中的具体采取:

  • 1.查找Gremlin朋友的情人

    g.V().has("name","gremlin").
      out("knows").
      out("knows").
      values("name")
    
  • 2.寻觅那个由四个对象一起创办的类型

    g.V().match(
      as("a").out("knows").as("b"),
      as("a").out("created").as("c"),
      as("b").out("created").as("c"),
      as("c").in("created").count().is(2)).
    select("c").by("name")
    
  • 3.付给Gremlin的富有上司,直至COO

    g.V().has("name","gremlin").
      repeat(in("manages")).
    until(has("title","ceo")).
      path().by("name")
    
  • 4.取得Gremlin协小编的头衔分布

    g.V().has("name","gremlin").as("a").
      out("created").in("created").
    where(neq("a")).
      groupCount().by("title")
    
  • 5.得到Gremlin购买产品的相干制品列表并排序

    g.V().has("name","gremlin").
      out("bought").aggregate("stash").
      in("bought").out("bought").
    where(not(within("stash"))).
      groupCount().order(local).by(values,decr)
    
  • 6.收获排行前十的骨干人物

    g.V().hasLabel("person").
      pageRank().
    by("friendRank").
    by(outE("knows")).
      order().by("friendRank",decr).
      limit(10)
    

a、规则:

protobuf把音讯结果message也是由此key-value对来代表。只是其中的key是使用一定的算法计算出来的即透过各种message中各种字段(field
index)和字段的数据类型举行演算得来的key = (index<<3)|type;

type类型的应和关系如下:

 

Type

Meaning

Used For

0

Varint

int32, int64, uint32, uint64, sint32, sint64, bool, enum

1

64-bit

fixed64, sfixed64, double

2

Length-delimited

string, bytes, embedded messages, packed repeated fields

3

Start group

groups (deprecated)

4

End group

groups (deprecated)

5

32-bit

fixed32, sfixed32, float

 

Value会根据数据类型的差距会有二种表现方式:

对此各个int,bool,enum类型,value就是Varint

对于string,bytes,message等等类型,value就是length+原始内容编码

 

Varints是一种紧密表示数字的法门。它用二个要么五个字节表示三个数字,值越小的数字字节数越少。相对于古板的用4字节代表int32品种数字,Varints对于小于128的数值都可以用1个字节表示,大于128的数值会用越来越多的字节来代表,对于很大的数码则需求用七个字节来代表。

 

Varints算法描述:
每壹个字节的最高位都以有异乎平日含义的,假使是1,则代表继续的字节也是该数字的一片段;即便是0,则截至

无缝嵌入主语言

  • 合并主开发语言和图查询语言
    经文数据库查询语言(如SQL)被认为与终极在生产条件中利用的编程语言截然不一样。因而,经典数据库需求开发人士既要编写主编程语言,还要编写数据库相应的查询语言。Gremlin统一了这一个划分,因为遍历可以用资助功效结合和嵌套(主要编程语言都帮衬)的其他编程语言编写。由此,用户的Gremlin遍历可以应用应用程序语言(主语言,Host
    language)编写,并收益于主语言及其工具(例如类型检查,语法高亮,点成就等)所提供的优点。近期留存各类Gremlin语言变体,包蕴:Gremlin-Java,Gremlin-Groovy,Gremlin-Python,Gremlin-Scala等。

  • 示范程序
    相比之下二种办法,高低立判:

    public class GremlinTinkerPopExample {
      public void run(String name, String property) {
    
    Graph graph = GraphFactory.open(...);
    GraphTraversalSource g = graph.traversal();
    
    double avg = g.V().has("name",name).
                   out("knows").out("created").
                   values(property).mean().next();
    
    System.out.println("Average rating: " + avg);
      }
    }
    

public class SqlJdbcExample {
  public void run(String name, String property) {

    Connection connection = DriverManager.getConnection(...)
    Statement statement = connection.createStatement();
    ResultSet result = statement.executeQuery(
      "SELECT AVG(pr." + property + ") as AVERAGE FROM PERSONS p1" +
        "INNER JOIN KNOWS k ON k.person1 = p1.id " +
        "INNER JOIN PERSONS p2 ON p2.id = k.person2 " +
        "INNER JOIN CREATED c ON c.person = p2.id " +
        "INNER JOIN PROJECTS pr ON pr.id = c.project " +
          "WHERE p.name = '" + name + "');

    System.out.println("Average rating: " + result.next().getDouble("AVERAGE")
  }
}

⑦ 、Protobuf的源码分析

命令式和表明式遍历

Gremlin遍历可以以命令式(程序式)格局,申明性(描述性)方式编写,也足以涵盖命令性和讲明性的鱼目混珠格局编写。

  • 命令式编写形式
    获取Gremlin同盟者的顶头上司名字分布:

    g.V().has("name","gremlin").as("a").
      out("created").in("created").
    where(neq("a")).
      in("manages").
      groupCount().by("name")
    

    一个命令式的Gremlin遍历告诉运营器怎么样举办遍历中的每一步;然后,遍历器分歧到独具的“Gremlin”的同盟者(去除Gremlin本身);下一步,遍历器走到“Gremlin”合营者的上级(managers),最后基于上级的名字进行计算分发。

据此是命令式的Gremlin遍历,就是它显然地、程序化地告诉遍历器“去这里,然后去那里”。

  • 申明式编写方式
    以下使用注明式编写形式贯彻了扳平的结果:

    g.V().match(
      as("a").has("name","gremlin"),
      as("a").out("created").as("b"),
      as("b").in("created").as("c"),
      as("c").in("manages").as("d"),
    where("a",neq("c"))).
      select("d").
      groupCount().by("name")
    

    申明式的Gremlin遍历并不可以告诉遍历器执行它们的步子的各类,而是允许每一个遍历器从贰个(恐怕嵌套的)形式的集纳中精选1个方式来执行。

不过,声明遍历具有额外的裨益,它不光选取了编译时查询布署器(如命令式遍历),而且依然一个运行时查询布署器,依照逐个格局的历史计算音讯采用下3个执行哪个遍历模式

  • 便宜那么些倾向于裁减/过滤大部分数目标格局。

用户能够选拔上述指出的措施编写本人的遍历语句。不管怎么样,用户的遍历语句都会根据现实的施行引擎和遍历策略traversal
strategies
被重写。Gremlin为用户提供灵活性表达友好的询问的;图系统也本着具体启用TinkerPop的数据系统举行有效地评估图遍历提供了灵活性。

④ 、空间成效

xml、json是用字段名称来鲜明类实例中字段之间的独立性,所以连串化后的数据多了诸多描述音信,扩展了种类化后的字节体系的体积。

 

Protobuf的连串化/反体系化进度可以汲取:

protobuf是由字段索引(fieldIndex)与数据类型(type)总计(fieldIndex<<3|type)得出的key维护字段之间的照射且只占多个字节,所以相比较json与xml文件,protobuf的系列化字节没有过多的key与叙述符音信,所以占用空间要小很多。

OLTP 和 OLAP遍历

  • 一回编写,随处运维
    Gremlin遵守“一回编写,随处运行”的统筹文学。这意味着不但全体的TinkerPop启用的图形系统都能举行Gremlin遍历,而且每种Gremlin遍历都可以被评估为实时数据库查询或批处理查询。(前者被称呼在线交易流程(OLTP),后者被称之为在线分析流程(OLAP))。

  • 协调多样图遍历
    那种普遍性是由Gremlin遍历机已毕的。那种分布式、基于图形的虚拟机通晓哪些协调多机器图遍历的进行。好处是,用户不须求上学数据库查询语言和域特定的BigData分析语言(例如SparkDSL,MapReduce等)。Gremlin是打造基于图的应用程序所须求的,其余全体都交给Gremlin遍历机处理。
    语言 1

五、Protobuf与json的对比

参考资料

The Gremlin Graph Traversal Machine and
Language

二 、java使用protobuf 的反系列化流程分析

java程序通过调用parserFrom(byte[] data)开首反体系化

 语言 2

语言 3

实际在com.google.protobuf. AbstractParser类中落实

 

语言 4

 

语言 5

语言 6

 

语言 7

 

 

最后在com.google.protobuf.CodedInputStream类中达成反连串化

⑤ 、Protobuf转化后的二进制文件

语言 8

 

空中效能

Json:107个字节

Protobuf:32个字节

 

日子成效

Json序列化: 1ms ,  反系列化:0ms

Protobuf 序列化: 0ms 反系列化:0ms

 

将public List<Phone> list和repeated PhoneInfo phoneInfoList
=3;都赋值为一千个PhoneInfo

 

空间功用

Json:4206个字节

Protobuf:1332个字节

 

时刻成效

Json序列化: 4ms ,  反种类化:1ms

Protobuf 序列化: 1ms 反序列化:0ms

1、创建product.proto文件

        定义了多少个Message(ProductInfo、PhoneInfo、沃特ch)新闻结构

语言 9

③ 、protobuf有怎么样用?

       
Xml、Json是当下常用的数据交流格式,它们一贯利用字段名称爱抚连串化后类实例中字段与数据里面的映照关系,一般用字符串的样式保留在系列化后的字节流中。音信和新闻的定义相对独立,可读性较好。但体系化后的多少字节很大,体系化和反体系化的光阴较长,数据传输功效不高。

       
Protobuf和Xml、Json连串化的法子各异,接纳了二进制字节的种类化情势,用字段索引和字段类型通过算法统计得到字段从前的涉及映射,从而达到更高的年华效用和空间效能,尤其适合对数码大小和传输速率相比较敏感的地方使用。

① 、protobuf在java使用的系列化流程

 

java程序调用parserFrom(byte[]
data)初叶字节种类的反体系,Java程序通过调用编译生类GenerateMessage中的wirteTo()方法开头将连串化后的字节写入输出流中

 语言 10

语言 11

GenerateMessage
继承AbstractMessage类,连串化最后在AbstractMesssage中完结,系列化的贯彻进度:

a、遍历对象中Message结构()

调用AbstractMessage类中的writeTo()方法

 语言 12

b、 体系化Message中每三个字段

调用CodeOutputStream类中的writeMessageSetExtension()方法

语言 13

 

c、 对于Varints  Tag 的种类化流程:

调用CodeOutputStream类中的writeUInt32()方法

语言 14

调用CodeOutputStream类中的WriteRawVarint32()方法

语言 15

 

d、 对于非Varints Tag的系列化

调用CodeOutputStream类中的WriteTag()方法

语言 16 

语言 17

 

实际的体系化完结都在CodedOutputStream中达成

 

② 、新闻结构对应的java类(ProductInfo、PhoneInfo、沃特ch)

语言 18

 

4、JSON字符串

 

{“phone”:{“phoneName”:”idol3″,”price”:2000,”top”:1},”watch”:{“watchName”:”tcl
wtch”,”top”:1,”price”:1000}}

 

一、protobuf是什么?

        protobuf(谷歌(Google) Protocol
Buffers)是谷歌提供七个具备便捷的协商数据互换格式工具库(类似Json),但比较之下于Json,Protobuf有更高的转化效用,时间作用和空中作用都以JSON的3-5倍。后边将会有简短的demo对于那二种格式的数量转发效用的对待。但那一个库近来应用还不是太流行,传说谷歌内部很多出品都有应用。

 

C、反种类化结果

phoneinfo为

phoneName = “idol3”

top = 1

price = 2000;

 

同样的办法watchInfo为:

watchName = “tcl name”

top = 1

price=2000 

二、protobuf有什么?

        Protobuf
提供了C++、java、python语言的支撑,提供了windows(proto.exe)和linux平台动态编译生成proto文件对应的源文件。proto文件定义了商谈数据中的实体结构(message
,field)

关键字message: 代表了实体结构,由七个音信字段(field)组成。

音讯字段(field): 包含数据类型、字段名、字段规则、字段唯一标识、专断认同值

数据类型:常见的原子类型都协助(在FieldDescriptor::kTypeToName中有定义)

字段规则:(在FieldDescriptor::kLabelToName中定义)

        required:必须开端化字段,如若没有赋值,在数额序列化时会抛出拾壹分

        optional:可选字段,可以不要早先化。

        repeated:数据足以重新(约等于java 中的Array或List)

        字段唯一标识:体系化和反连串化将会拔取到。

默认值:在概念音讯字段时方可给出暗许值。

 

③ 、时间效能

透过protobuf连串化/反种类化的经过可以汲取:protobuf是通过算法生成二进制流,连串化与反种类化不要求分析相应的节点属性和多余的叙述音讯,所以系列化和反序列化时间作用较高。

四 、Protobuf在Android上的应用

一 、成立proto文件,定义新闻的实体结构

② 、编译proto文件生成对应的java文件

3、添加protobuf-java-2.5.0.jar到android工程

④ 、在android中落成对新闻结构的体系化/反序列化  

 

 

 

六 、protobuf的简练解析

三 、动态编译

以windows下用protoc.exe工具完毕proto文件编译为例,protoc.exe是用C++完毕。在控制台执行命令:

语言 19

编译的流程:

检查proto的语法规则

将proto的文书中的message结构转换为GenerateMessage类的子类,并落到实处Builder接口。

编译流程

Main.cc中的main()方法

语言 20

 

Command_line_interface.cc中的Run()方法

语言 21

 

Import类中Import()

语言 22

 

在Descriptor中达成message消息的搜集和转化。

二 、数据系列化/反系列化

b、demo生成的的二进制文件反连串化。

第1个字节 (0A)

字段索引(index):         0A = 0001010  0A>>3 = 001 = 1

数据类型(type):           0A = 0001010&111  = 2 (String);

 

第2个字节 (0C)

字符串长度(length):      0E = 12;

字符串:                         0A 05 69 64 6F 6C 33 10 01 18 BD 0F

 

第3个字节 (0A)

因为字符串是来源于phoneInfo属于嵌套类型

字段索引(index):         0A = 0001010  0A>>3 = 001 = 1

数据类型(type):           0A = 0001010&111  = 2 (String);

第4-9个字节(69 64 6F 6C 33)

字符串长度(length):    05 = 5

字符串:                       69 64 6F 6C 33 = idol3

 

第10个字节 (10)

字段索引(index):         10 = 000一千0    10A>>3 = 0010 = 2

数据类型(type):           10 = 00010000&111  = 0 (Varints);

 

第11个字节  (01)

Varints:                          01 = 00001字节的参天位为0 整数停止

Value:                            1;

 

第12个字节(18)

字段索引(index):           18 = 0001一千    18>> 00011 = 3

数据类型(type):           18 = 0001一千&111  = 0 (Varints);

 

第13个字节(D0)

最高位为1,整数计算到下二个字节

 

第14个字节(0F)

参天位为0,整数统计甘休

Value:为11111010000 =2000

 

Protobuf的简练介绍、使用和分析

 

1、优缺点

亮点:通过上述的光阴功效和空中效能,可以见到protobuf的空中功用是JSON的2-5倍,时间功能要高,对于数据大小敏感,传输作用高的模块可以采取protobuf库

 

症结:音讯结构可读性不高,系列化后的字节种类为二进制种类不只怕不难的剖析有效性;近来使用不常见,只匡助java,C++和Python;

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图