1、属性
schema.propertyKey("name").asText().valueSingle().ifNotExist().create();
允许定义的约束信息包括:name,datatype,cardinality,userdata;
userdata 是用户可以添加的附加属性。
2、顶点
// 使用 Automatic 的 Id 策略
schema.vertexLabel("person").properties("name", "age").ifNotExist().create();
schema.vertexLabel("person").useAutomaticId().properties("name", "age").ifNotExist().create();
// 使用 Customize_String 的 Id 策略
schema.vertexLabel("person").useCustomizeStringId().properties("name", "age").ifNotExist().create();
// 使用 Customize_Number 的 Id 策略
schema.vertexLabel("person").useCustomizeNumberId().properties("name", "age").ifNotExist().create();
// 使用 PrimaryKey 的 Id 策略
schema.vertexLabel("person").properties("name", "age").primaryKeys("name").ifNotExist().create();
schema.vertexLabel("person").usePrimaryKeyId().properties("name", "age").primaryKeys("name").ifNotExist().create();
// 删除节点
schema.vertexLabel("person").remove();
// 获取VertexLabel对象
schema.getVertexLabel("name")
// 获取property key属性
schema.getVertexLabel("person").idStrategy()
schema.getVertexLabel("person").primaryKeys()
schema.getVertexLabel("person").name()
schema.getVertexLabel("person").properties()
schema.getVertexLabel("person").nullableKeys()
schema.getVertexLabel("person").userdata()
允许定义的约束信息包括:name,idStrategy,properties, primaryKeys, nullableKeys
3、边
允许定义的约束信息包括:name,sourceLabel,targetLabel,frequency,properties,sortKeys,和 nullableKeys。
frequency 表示两个顶点间某个关系可能出现的次数,singleTime() 或 multiTimes(),比如进程之间的连接可以为多个。
// 创建边
schema.edgeLabel("knows").link("person", "person").properties("date").ifNotExist().create();
schema.edgeLabel("created").multiTimes().link("person", "software")
.properties("date").sortKeys("date").ifNotExist().create();
// 删除边
schema.edgeLabel("knows").remove();
// 获取EdgeLabel对象
schema.getEdgeLabel("knows")
// 获取property key属性
schema.getEdgeLabel("knows").frequency()
schema.getEdgeLabel("knows").sourceLabel()
schema.getEdgeLabel("knows").targetLabel()
schema.getEdgeLabel("knows").sortKeys()
schema.getEdgeLabel("knows").name()
schema.getEdgeLabel("knows").properties()
schema.getEdgeLabel("knows").nullableKeys()
schema.getEdgeLabel("knows").userdata()
4、索引
允许定义的约束信息包括:name,baseType, vaseValue, indexFields, indexType。
baseType,baseValue 配合使用,用于区分是为 VertexLabel 还是 EdgeLabel 建立索引。
索引类型 | 说明 | 示例 |
---|---|---|
Secondray | 单个属性支持相等查询,联合索引支持前缀查询和相等查询 | 1. g.V().has(“city”, “北京”) 查询 city 属性为北京的节点 2. g.V().has(“city”, “北京”).has(“street”, “中关村街道”) |
Range | 支持数值类型的范围查询 | 1. g.V().has(“age”, P.gt(18)) 2. 支持 gte()、lte()、lt()、eq(),between()、inside()、outside() |
Search | 支持全文检索的索引 | g.V().has(“address”, Text.contains(“大厦”)) |
Shard | 支持前缀匹配 + 数字范围查询的索引 | g.V().has (“city”, “北京”).has(“age”, P.between(18, 30)) |
Unique | 支持属性值唯一性约束,即可以限定属性的值不重复,允许联合索引,但不支持查询 | 当出现重复值时将报错 |
// 创建索引
schema.indexLabel("personByAge").onV("person").by("age").range().ifNotExist().create();
schema.indexLabel("createdByDate").onE("created").by("date").secondary().ifNotExist().create();
schema.indexLabel("personByLived").onE("person").by("lived").search().ifNotExist().create();
schema.indexLabel("personByCityAndAge").onV("person").by("city", "age").shard().ifNotExist().create();
schema.indexLabel("personById").onV("person").by("id").unique().ifNotExist().create();
// 删除索引
schema.indexLabel("personByAge").remove()
// 获取IndexLabel对象
schema.getIndexLabel("personByAge")
// 获取property key属性
schema.getIndexLabel("personByAge").baseType()
schema.getIndexLabel("personByAge").baseValue()
schema.getIndexLabel("personByAge").indexFields()
schema.getIndexLabel("personByAge").indexType()
schema.getIndexLabel("personByAge").name()
1、顶点
Vertex marko = graph.addVertex("label", "person", "name", "marko", "age", 29);
Vertex lop = graph.addVertex("label", "software", "name", "lop", "lang", "java", "price", 328);
2、边
Edge knows1 = marko.addEdge("knows", vadas, "city", "Beijing");
注意:当frequency为multiple时必须要设置sortKeys对应属性类型的值。
1、查找 name = marko 的 person 是否认识 name = josh 的 person
g.V().hasLabel('person').has('name','marko').out('knows')
.hasLabel('person').has('name','josh').hasNext()
如果存在,返回结果
[true]
2、
g.V().hasLabel('person').where(outE("created").count().is(P.gte(2))).count()
3、
g.V().hasLabel('person').has('name','marko').out("knows").hasLabel("person").values("age").min()
4、查找 hercules 的祖父
g.V().hasLabel('character').has('name','hercules').out('father').out('father')
或者
g.V().hasLabel('character').has('name','hercules').repeat(__.out('father')).times(2)
5、查找 hercules 父亲的名称
g.V().hasLabel('character').has('name','hercules').out('father').value('name')
6、查找年龄大于 100 岁的人物
g.V().hasLabel('character').has('age',gt(100))
7、查找与 pluto 生活在一起的人
g.V().hasLabel('character').has('name','pluto').out('lives').in('lives').values('name')
8、Find pluto can’t be his own cohabitant
pluto = g.V().hasLabel('character').has('name', 'pluto')
g.V(pluto).out('lives').in('lives').where(is(neq(pluto)).values('name')
// use 'as'
g.V().hasLabel('character').has('name', 'pluto').as('x').out('lives').in('lives').where(neq('x')).values('name')
9、pluto 的兄弟
pluto = g.V().hasLabel('character').has('name', 'pluto').next()
// where do pluto's brothers live?
g.V(pluto).out('brother').out('lives').values('name')
// which brother lives in which place?
g.V(pluto).out('brother').as('god').out('lives').as('place').select('god','place')
// what is the name of the brother and the name of the place?
g.V(pluto).out('brother').as('god').out('lives').as('place').select('god','place').by('name')
什么是 traversal,模型?在两个点之间游走,起点,到终点,有四个部分组成:
参考资料:
http://tinkerpop.apache.org/gremlin.html
https://tinkerpop.apache.org/docs/current/recipes/
http://tinkerpop.apache.org/docs/3.4.6/reference/#dsl
http://tinkerpop.apache.org/docs/current/tutorials/gremlins-anatomy/
http://kelvinlawrence.net/book/Gremlin-Graph-Guide.html#gq