第2期 Gremlin Steps:
out()
、
in()
、
both()
、
outE()
、
inE()
、
bothE()
、
outV()
、
inV()
、
bothV()
、
otherV()
本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考
准备Gremlin执行环境
,本文示例均以其中的“TinkerPop关系图”为初始数据,如下图所示:
上一期:
深入学习Gremlin(1):图基本概念与操作
边遍历概念
边遍历是指通过顶点来访问与其有关联边的邻接顶点(或者仅访问邻接边),边遍历是图数据库与图计算的核心。我们先以
TinkerPop官网
的例子来解释一下边遍历的相关Steps:
顶点为基准的Steps(如上图中的顶点“4”):
-
out(label)
: 根据指定的EdgeLabel来访问顶点的OUT方向邻接点(可以是零个EdgeLabel,代表所有类型边;也可以一个或多个EdgeLabel,代表任意给定EdgeLabel的边,下同)
-
in(label)
: 根据指定的EdgeLabel来访问顶点的IN方向邻接点
-
both(label)
: 根据指定的EdgeLabel来访问顶点的双向邻接点
-
outE(label)
: 根据指定的EdgeLabel来访问顶点的OUT方向邻接边
-
inE(label)
: 根据指定的EdgeLabel来访问顶点的IN方向邻接边
-
bothE(label)
: 根据指定的EdgeLabel来访问顶点的双向邻接边
边为基准的Steps(如上图中的边“knows”):
-
outV()
: 访问边的出顶点(注意:这里是以边为基准,上述Step均以顶点为基准),出顶点是指边的起始顶点
-
inV()
: 访问边的入顶点,入顶点是指边的目标顶点,也就是箭头指向的顶点
-
bothV()
: 访问边的双向顶点
-
otherV()
: 访问边的伙伴顶点,即相对于基准顶点而言的另一端的顶点
下面通过实例来深入理解每一个操作。
-
Step
out()
:访问顶点的OUT方向邻接点
示例1:
g.V().out()
示例2:
g.V('3:TinkerPop').out()
目前讲解过的Gremlin Steps中,顶点的id可通过
g.V()
来获取,也可通过即将讲解的
has()
来获取(根据属性查询顶点)。
示例3:
g.V('3:TinkerPop').out('define')
动手比一比:
g.V('3:TinkerPop').out()
g.V('3:TinkerPop').out('define', 'contains')
-
Step
in()
:访问顶点的IN方向邻接点
示例1:
g.V('3:TinkerPop').in()
示例2:
g.V('3:TinkerPop').in('implements')
-
Step
both()
:访问顶点的双向邻接点
示例1:
g.V('3:TinkerPop').both()
示例2:
g.V('3:TinkerPop').both('implements', 'define')
-
Step
outE()
: 访问顶点的OUT方向邻接边
示例1:
g.V('3:TinkerPop').outE()
示例2:
g.V('3:TinkerPop').outE('define')
-
Step
inE()
: 访问顶点的IN方向邻接边
示例1:
g.V('3:TinkerPop').inE()
示例2:
g.V('3:TinkerPop').inE('implements')
-
Step
bothE()
: 访问顶点的双向邻接边
示例1:
g.V('3:TinkerPop').bothE()
示例2:
g.V('3:TinkerPop').bothE('define', 'implements')
-
Step
outV()
: 访问边的出顶点
示例1:
g.V('3:TinkerPop').inE().outV()
一般情况下,
inE().outV()
等价于
in()
动手试一试:
g.V('3:TinkerPop').outE().outV()
-
Step
inV()
: 访问边的入顶点
示例1:
g.V('3:TinkerPop').outE().inV()
一般情况下,
outE().inV()
等价于
out()
动手试一试:
g.V('3:TinkerPop').inE().inV()
-
Step
bothV()
: 访问边的双向顶点
示例1:
g.V('3:TinkerPop').outE().bothV()
注意:
bothV()
会把源顶点也一起返回,因此只要源顶点有多少条出边,结果集中就会出现多少次源顶点
-
Step
otherV()
: 访问边的伙伴顶点
示例1:
g.V('3:TinkerPop').outE().otherV()
一般情况下,
outE().otherV()
等价于
out()
,
inE().otherV()
等价于
in()
示例2:
g.V('3:TinkerPop').bothE().otherV()
一般情况下,
bothE().otherV()
等价于
both()
-
多度查询
g.V('javeme').out('created').out('implements').out('contains').out('supports')
-
查询支持Gremlin语言的软件的作者
g.V('4:Gremlin').in('supports').in('created')
-
查询某个作者的共同作者
g.V('javeme').out('created').in('created')
下一期:
深入学习Gremlin(3):has条件过滤
doNotCheckCapabilities(不检查功能)
numDecimalPlaces(-num-decimal-places)
outputOutOfBagComplexityStatistics(-输出袋外复杂性统计信息)
numExecutionSlots(-num-slots)
printClassifiers(打印)
RepresentativeC
op
iesU
实例化一个脚本对象:
var
Gremlin
Script = require ( '
gremlin
-script' ) .
Gremlin
Script ;
var
gremlin
= new
Gremlin
Script ( ) ;
获取对
图
形的引用:
var Graph = require ( '
gremlin
-script' ) . Structure . Graph ;
var g = new Graph ( 'g' ) ; // pass graph identifier/name to
您必须首先以特定于平台的方式安装 Graphviz 包。
查看单元测试了解更多信息,但这里有一个味道:
// Create a
Gremlin
graph with some data.
var
Gremlin
= require ( '
gremlin
-v3' ) ;
var
gremlin
= new
Gremlin
( ) ;
var
Tink
erFactory =
gremlin
. java . import ( 'com.
tink
erp
op
.
gremlin
.
tink
ergraph.structure.
Tink
erFactory' ) ;
var
gremlin
Graph =
gremlin
. wrap (
Tink
erFactory . createCla
注意:此项目不再维护。 项目所有者现在使用 ,它利用了 。 我们建议你看看这两个项目。
用于 node.js 的实现。
Gremlin
-node 是一个围绕
Gremlin
API 的 javascript 包装器。 node-java 模块提供了 node 和 Java 之间的桥梁。
var
Gremlin
= require ( '
gremlin
' ) ;
var
gremlin
= new
Gremlin
( {
classpath : [ ... ] ,
op
tions : [ ... ]
} ) ;
var
Tink
erGraphFactory =
gremlin
. java . import ( 'com.
tink
erp
op
.blueprints.impls.tg.
Tink
erGraphFactory' ) ;
var graph =
Tink
erG
Problem Description:
图
着色问题是一个著名的NP完全问题。给定无向
图
G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?
但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是
图
着色问题的一个解。
Input:
输入在第一行给出3个整数V(0<V≤500)、E(≥0)和K(0<K≤V),...
文章目录一、树的概念1、特点2、树的术语3、树的种类4、树的存储与表示5、常见的树的应用场景二、二叉树1、概念2、性质
一、树的概念
树是一种抽象数据类型(ADT)或是视作这种抽象数据类型的数据结构
每个节点有零个或多个子节点
没有父节点的节点称为根节点
每一个非根节点有且只有一个父节点
除了根节点外,每个子节点可以分为**多个不相交(因为都只有一个父节点)**的子树
2、树的术语
节点的度:一个节点含有的子树的个数称为该节点的度
树的度:一棵树中,最大的节点的度称为树的度
叶节点或终端节点
文章目录1. RDF
图
数据模型1.1 资源描述框架RDF1.2 RDF
图
数据模型1.3 RDF Schema(简称RDFS)2.SPARQL查询语言2.1 SPARQL 语法2.2 SPARQL 命名空间2.3 SPARQL 数据集2.4 SPARAL 查询语言2.5
图
模式定义2.6 SPAQAL 组
图
模式 联合
图
模式2.7 SPAQAL 符号优先级2.8 SPAQAL 结果修饰2.9 SPAQAL语义2.10
图
模式的匹配2.11 SPARQL 新特性3.属性
图
模型和Cypher查询语言3.1 属性
图
1.1 深度优先
遍历
的定义
深度优先搜索(Depth_First Search)
遍历
类似于树的先根
遍历
,是树的先根
遍历
的推广。
假设给定
图
G,
图
中所有顶点未曾被访问过,则深度优先搜索可以从
图
中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先
遍历
图
,直至
图
中所有和v有路径相通的顶点都被访问到;若此时
图
中尚有顶点未被访问,则另选
图
中一个未曾
今天遇到了两道要求
遍历
所有最短路径的题,我一直做不对的原因竟是我把无向
图
当成了有向
图
,郁闷的要死。
解决
遍历
所有最短路径,其实思路很简单,首先通过经典算法[各种算法,Dijkstra,bellman,floyd]求出最短路径的长度,然后就只能DFS来找寻起始点、终点一样,长度为最短路径长度的路径即可,在DFS中可以使用Path[]数组来保存路径。
DFS时注意要剪枝,路径上已经走过的点不要重复
[2, 4, 6, 8, 10]
原因很简单,for会去获取列表的迭代器,每次循环时按次序获取内容,这次取n下次循环就取n+1,但是循环体中对列表做remove
操作
,导致每次循环列表中的元素都会前移一位,也就是n+1变为了n,而n+...
到了新公司用到了
tink
erP
op
的
gremlin
语句,由于是全英文的文档。为了杜绝我鱼记忆,决定整理一下以后查看方便。嗯嗯~ o(* ̄▽ ̄*)o附
图
:语句来源于
图
片初步认识:点:蓝色的圈代表顶点(查询语句中的V()),圈中的person代表顶点的名称,name和age为顶点的属性。边:黑色的线代表边(查询语句中的E()),线上的knows代表边的名称,weight为边的属性。一、Lambda S...