gremlin 查询语句日常用法总结

// 字段数据过滤: 过滤字段节点类型中只有一条边关系的数据
g.V(id).repeat(bothE().bothV().where(__.not(hasLabel('column').bothE().count().is(1)))).times(1).path();

在这里插入图片描述

// 实体单个属性值模糊匹配
g.V(id).repeat(bothE().bothV().has("table", "name", org.janusgraph.core.attribute.Text.textRegex('.*user.*')));
==>user
// 实体多个属性值模糊匹配
g.V(id).repeat(bothE().bothV().has("table", "tag", org.janusgraph.core.attribute.Text.textRegex('.*(authority|invest).*')));
==>invest
==>authority

多讲一下JanusGraph “后端索引”

查询谓语

比较谓语
	eq (equal)
	neq (not equal)
	gt (greater than)
	gte (greater than or equal)
	lt (less than)
	lte (less than or equal)
文本操作谓语(Text Predicate)
主要可以用这些operator做full-text search,常见的有两类:
	String中以词为粒度的
	textContains
	textContainsPrefix
	textContainsRegex
	textContainsFuzzy
	
以整个String为粒度的
	textPrefix
	textRegex
	textFuzzy
区间操作谓语(Geo Predicate)
区间操作谓语包括:
	geoIntersect
	geoWithin
	geoDisjoint
	geoContains

查询样例


```javascript
g.V().has("name", "hercules")
// 2) 找到年龄大于50的点
g.V().has("age", gt(50))
// 查询年龄在1000到5000之间的点,并按照年龄升序排列
g.V().has("age", inside(1000, 5000)).order().by("age", incr)
// 查询年龄在1000到5000之间的点,并按照年龄降序排列
g.V().has("age", inside(1000, 5000)).order().by("age", decr)
// 3) 找到距离给定经纬度对最多50公里处的所有边
g.E().has("place", geoWithin(Geoshape.circle(37.97, 23.72, 50)))
// 4) 找到属性“reason”包含“loves”的边
g.E().has("reason", textContains("loves"))
// 或包含两个单词的所有边(需要分块成单个单词)
g.E().has("reason", textContains("loves")).has("reason", textContains("breezes"))
// 或包含以“lov”开头的单词的所有边
g.E().has("reason", textContainsPrefix("lov"))
// 或包含与正则表达式“br[ez]*s”完全匹配的单词的所有边
g.E().has("reason", textContainsRegex("br[ez]*s"))
// 或所有包含类似于“love”的词的边
g.E().has("reason", textContainsFuzzy("love"))
// 5) 找到所有年龄超过1000,并且名称是“saturn”实体
g.V().has("age", gt(1000)).has("name", "saturn")

索引参数和全局搜索
当我们定义一个Mixed index的时候,每一个被添加到索引中的property key都有一系列参数可以设置。

Full-Text Search
全局索引,这是一个很重要的功能。当我们去索引字符串类型的property key的时候,我们可以选择从character层面后者text层面去索引,这需要改变 mapping 参数。

当我们从text层面去索引的时候,字符串会被tokenize成bag of words,用户便可以去query是否包含一个或多个词,这叫做 full-text search。

当我们从char层面去索引的时候,string会直接和char串做match,不会有futher analysis后者tokenize操作。这可以方便我们去查找是否包含某个字符序列,这也叫做 string search。

下面分开讲:

Full-Text Search
当我们使用text层面的index的时候,只有全局索引的谓语才真正用到了我们创建的索引,包括textContains方法,textContainsPrefix方法,textContainsRegex方法和textContainsFuzzy方法,注意,full-text search是case-insensitive的,下面是具体的例子:

import static org.janusgraph.core.attribute.Text.*
g.V().has('booksummary', textContains('unicorns'))
g.V().has('booksummary', textContainsPrefix('uni'))
g.V().has('booksummary', textContainsRegex('.*corn.*'))
g.V().has('booksummary', textContainsFuzzy('unicorn'))

String Search
当我们使用string层面的index的时候,只有下面的谓语才真正用到了我们创建的索引,包括eq,neq、textPrefix、textRegex和textFuzzy。注意,string search是case-insensitive的,下面是具体的例子:

import static org.apache.tinkerpop.gremlin.process.traversal.P.*
import static org.janusgraph.core.attribute.Text.*
g.V().has('bookname', eq('unicorns'))
g.V().has('bookname', neq('unicorns'))
g.V().has('bookname', textPrefix('uni'))
g.V().has('bookname', textRegex('.*corn.*'))
g.V().has('bookname', textFuzzy('unicorn'))
// 获取在10毫秒内查询到的结果
g.V().has('airport','code','AUS').repeat(timeLimit(10).out()).until(has('code','LHR')).path().by('code')
发布了1 篇原创文章 · 获赞 0 · 访问量 20
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览