Gremlin 是操作图表的一个非常有用的图灵完备的编程语言。它是一种Java DSL语言,对图表进行查询、分析和操作时使用了大量的XPath。

Gremlin可用于创建多关系图表。因为图表、顶点和边的元素含有由键值对定义的属性,所以图表被称之为属性图表,以下是一个示例:

它包含以下类型:

  • 图表:图表是由一组顶点和一组边构成的。
  • 顶点:顶点由一组出边(从顶点指出的边),入边(指向顶点的边),和属性表组成。
  • 边:边由出点,入点和属性表组成。
  • 布尔型:布尔型有true和false。
  • 数字型:数字型可以是整数(integer)也可以是实数(double)。
  • 字符型:字符型是字符串数组。
  • 列表型:列表是一个有序可重复的对象集合。
  • map型:map是一个从一组键值对象到一组值对象的关联数组

除了XPath的数学计算(加,减,乘)之外,Gremlin还提供了很多语句,如If/Else,While,Repeat,Foreach以及其他。

Gremlin可用于任何实现了通用图表模型(General Graph Model)的框架。该模型包括一系列组件(如图、元素、顶点、边和索引)以及相应的Java接口,欲使用Gremlin结构来操作图片,则需要实现这些接口。

使用Gremlin操作图片的一个例子存在于MongoDB文档中。另一个是与资源描述框架(Resource Description Framework)存储一起用于OpenRDFAllegroGraphOpen Virtuoso 或者 Neo4j等图数据库中。将来,Gremlin团队将有意添加对CouchDB和Terracotta的支持。

示例

要理解JSON编码的图片,你就需要使用以下模式(schema)来描述顶点和边。

object {
string "_id";
array { string } inEdges;
array { string } outEdges;
object { }* properties;
};
object {
string "_id";
string label;
string inVertex;
string outVertex;
object { }* properties;
};

然后,上述图片在用JSON编码后如下所示:

//// VERTEX COLLECTION ////
{
_id: "1",
properties: {
name : "marko",
age : 29 },
outEdges : ["7","8","9"]
}
{
_id: "2",
properties: {
name : "vadas",
age : 27
},
inEdges : ["7"]
} ... [section skipped for brevity]
//// EDGE COLLECTION ////
{
_id: "12",
label: "created",
properties: { weight : 0.2 },
outVertex : "6",
inVertex : "3"
}

该数据存储到MongoDB时,数据库将创建两个集合,一个顶点集合,一个边集合,Gremlin允许你通过通用图表模型接口操作这些集合,如添加/删除顶点或边,获取顶点或边的集合,获取/设置顶点或边的属性,通过查找顶点所关联的边或者查找边所关联的顶点在图片上导航。

向一个图片添加两个顶点并将它们通过边连接起来的动作称之为“related_to”,它是这么实现的:

 gremlin> $v := g:add-v($g) ==>v[0]
gremlin> $u := g:add-v($g) ==>v[1]
gremlin> $e := g:add-e($g, $v, 'related_to', $u) ==>e[2][0-related_to->1]

在电脑芯片设计,生物学,网络学等方面有相当多的图表应用。一个简单的例子是创建这样一个图,顶点表示网站中的网页,而边表示页面指向另一个页面的链接。在Gremlin中你可以对这样的页面图表进行更改和编辑其属性。G

Gremlin--一种支持对图表操作的语言的更多相关文章

  1. 一文了解各大图数据库查询语言(Gremlin vs Cypher vs nGQL)| 操作入门篇

    文章的开头我们先来看下什么是图数据库,根据维基百科的定义:图数据库是使用图结构进行语义查询的数据库,它使用节点.边和属性来表示和存储数据. 虽然和关系型数据库存储的结构不同(关系型数据库为表结构,图数 ...

  2. IOS文件操作的两种方式:NSFileManager操作和流操作

    1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...

  3. Proxy --支持的拦截操作篇

    下面是 Proxy 支持的拦截操作一览. 对于可以设置.但没有设置拦截的操作,则直接落在目标对象上,按照原先的方式产生结果. (1)get(target, propKey, receiver) 拦截对 ...

  4. HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成数据的增删改查

    转:http://www.th7.cn/db/nosql/201510/135382.shtml 1. HDFS的文件append功能 早期版本的HDFS不支持任何的文件更新操作,一旦一个文件创建.写 ...

  5. spring3: 对JDBC的支持 之 关系数据库操作对象化

    7.3.1  概述 所谓关系数据库对象化其实就是用面向对象方式表示关系数据库操作,从而可以复用. Spring JDBC框架将数据库操作封装为一个RdbmsOperation,该对象是线程安全的.可复 ...

  6. Xamarin图表开发基础教程(11)OxyPlot框架支持的图表类型

    Xamarin图表开发基础教程(11)OxyPlot框架支持的图表类型 OxyPlot组件中支持7种类型的条型图表,分别为普通条形图.线型条形图.矩形条形图.差值图.龙卷风图.普通柱形图和柱形误差图, ...

  7. Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型

    Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型 OxyPlot组件支持26种图表,这些图表按照功能和样式可以分为4大类,分别为线型图表.条型图表.金融图表和其它图表. 线型图表 ...

  8. javascript - 可编辑表格控件 支持全键盘操作(无JS框架)

    项目中经常会用到表格编辑控件,网上也有不少,但是确实没有完全符合我要求的, 自己写一个吧! 1.该控件支持 数据显示列,文本编辑列,选择列,下拉列,索引列,删除列 六种列类型 2.支持全键盘操作,自定 ...

  9. 谈谈Delphi中的类和对象4---类是一种对数据和操作高度的封装机制 && 类是一种代码重用机制

    五.类是一种对数据和操作高度的封装机制 1)数据封装 unit Unit2; interface type TEmployee = class; private FName: String; publ ...

随机推荐

  1. P1114 “非常男女”计划

    题意:给你一个01串,求满足0和1总数相等的最大字串   $n\ \le\ 10^5$ 1.$O(n^3)$枚举起点终点,统计判断是否成立 2.$O(n^2)$先$O(n)$时间计算01个数的前缀和, ...

  2. the swap trick用于锐减过剩容量

    1.由于vector的复制构造函数只为被复制的vector分配它所需要的空间,故可以用如下的方式来削减vector v中过剩的容量:vector<int>(v).swap(v) 2.the ...

  3. java 的开发工具IDEA使用 中Debug 调试工具使用

    IDEA JetBrains(这个公司的名称翻译过来就是“大脑喷射?”) 公司的宣传语是这么说的:Develop with pleasure!(带着快乐开发!)   话不多说 开始debug   1, ...

  4. 2016"百度之星" - 资格赛(Astar Round1)C

    Problem Description 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 1.insert : 往神奇字典中插入一个单词 2.delete: 在神奇字典中删除所有前缀等于给定字 ...

  5. sqlserver 数据库表分区

    参考文档 https://msdn.microsoft.com/zh-cn/library/ms345146(SQL.90).aspx http://blog.sina.com.cn/s/blog_4 ...

  6. CSS background 属性全家桶

    介绍我们都知道css的background属性是一个复合属性,可以简写成一行代码,也可以将每个属性分开来写. background 简写属性在一个声明中设置所有的背景属性.如:body{ backgr ...

  7. java生成临时令牌和访问令牌

    public String getTicket(String logo, String productId) { String aTicket = ""; SimpleDateFo ...

  8. selenium-webdriver(python) (十四) -- webdriver原理(转)

    之前看乙醇视频中提到,selenium 的ruby 实现有一个小后门,在代码中加上$DEBUG=1 ,再运行脚本的过程中,就可以看到客户端请求的信息与服务器端返回的数据:觉得这个功能很强大,可以帮助理 ...

  9. Oulipo(Hash入门第一题 Hash函数学习)

    Hash,一般翻译做散列.杂凑,或音译为哈希,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的 ...

  10. UGUI 哪些显示在前方的问题

    1.对于一个场景里不同的Canvas来说,越最后创建的或者越最后激活的Canvas,越显示在前方. 2.对于同一个Canvas里的UI来说在Hierarchy面板越靠下越显示在前方.