一、关于TinkerPop
Apache TinkerPop是
在Apache2旗下的一种开源的、与供应商无关的、图形计算框架。当一个数据系统被启用时,它的用户就可以用Gremlin图形遍历语言对其域进行建模,并分析该图表。此外,所有支持tinkerpop的系统都可以相互集成,允许用户轻松地扩展他们的产品,并允许用户为他们的应用程序选择合适的图形技术。有时,应用程序最好由内存中的事务图数据库提供。有时,一个多机器的分布式图形数据库将完成这项工作。或者,应用程序既需要一个分布式图形数据库来进行实时查询,同时又需要一个大型(图)数据处理器来进行批处理分析。不管应用程序的需求是什么,它都存在一个能够满足其需求的可用于支持的图形系统。
二、常用命令
1.tinkerPop命令及函数在java中的应用
a.使用“
—”调用其他函数,表示匿名调用,如
out(),count()等。
b.使用类“
P ”调用常用的比较函数,如
neq(),gt()等。
//找出重复数大于num的用户
public Map<Object, Long> queryUseridBycountNum(String userId,int num){
List<Map<Object, Long>> list=null;
Map<Object, Long> map=new HashMap<Object, Long>();
list=g.V().has("userId",userId).as("a").out().in().where
(
P.neq("a")).groupCount().by("userId").toList();
Set<Map.Entry<Object, Long>> entrySet=list.get(0).entrySet();
for (Map.Entry<Object, Long> entry:entrySet) {
if(entry.getValue()>num) {
map.put(entry.getKey(),entry.getValue());
}
}
return map;
}
//match函数使用
g.V(561296).
match(
__.as("a").out("has_phone").as("b"),
__.as("b").in("has_phone").as("c").where("a",
P.eq("c"))).
select("a").by("userId").toList() //获得匹配条件的userId:22
c
.使用类"
T
"调用常用的图形标签操作,如label。
g.V(561296).outE().groupCount().by(
T.label).toList()
// [{business_phone=1, has_phone=1, job_in=1, phoneContacts=65, emergency_contact=1}]
g.V(561296).out("phoneContacts").count().toList().get(0) //获得符合出边的总数目65
Set<Map<Object, Object>> set=null;
set=g.V().has("userId",22).outE().group().by(
T.label).toSet();
//
Set<Edge> set=null;
set=g.V().has("userId",22).outE().toSet();
for(Edge edge:set) {
System.out.println(edge.label()+","+edge.outVertex().value("userId")+"->>"+edge.inVertex());
}
//
2.部分常用函数及其解释
以此图为例,说明以下方法
local 关键字
一个GraphTraversal 遍历操作一个连续的对象流。在许多情况下,在该流中操作单个元素是很重要的。要执行这样的对象-局部遍历计算,局部()-step存在(分支)。即操作对象是局部元素对象而非整个数据流。
coalesce(“xxxx”,“aaaa”)
合并()-步骤按顺序计算所提供的遍历,并返回至少一个元素的第一个遍历。首先按xxxx的路径来遍历查找元素,若未查到相关元素,则开始按aaaa路径开始查找元素
emit()函数
emit会将traverser一分为二——在整个遍历到的结果中分为已经退出的代码块和继续遍历的代码块,但最后还是会返回整个代码块的结果。
如: g.V(
1
).repeat(out()).times(
2
).emit().path().by(
'name'
)
当第一次遍历遍历到所有出边的顶点,包括lop,vadas,josh,此时loop=1,因为emit被声明为true
(
i.e.emit() == emit{true}
)
,所以,这些顶点被释放,此时也就是说扫描到的顶点在下次操作时不会将不符合条件的顶点置出,只是将其退出当前代码块,继续遍历,只要有遍历成功的顶点,就将loop=2,继续遍历直到结束,如果遍历过程中没有出现loop=2的结果,则结果就是第一次遍历到的节点信息,所以,无论最后有没有遍历出符合loop=2的节点,都会有所输出,因此结果如下。
注:emit()不可单用,否则会报空指针,通常与repeat()函数一起使用
until()
both("xxx")
移动到传入和传出的相邻顶点,包括出边和入边的顶点,"xxx"为边label可变长参数。