27. Gremlin Java API
27.1、Maven配置
在Maven的pom.xml配置文件中增加如下引用:
<dependency>
<groupId>org.janusgraph</groupId>
<artifactId>janusgraph-core</artifactId>
<version>0.4.0</version>
</dependency>
<dependency>
<groupId>org.janusgraph</groupId>
<artifactId>janusgraph-cql</artifactId>
<version>0.4.0</version>
</dependency>
<dependency>
<groupId>org.janusgraph</groupId>
<artifactId>janusgraph-es</artifactId>
<version>0.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.tinkerpop</groupId>
<artifactId>gremlin-driver</artifactId>
<version>3.4.1</version>
</dependency>
27.2、配置JanusGraph配置文件janusgraph-cql-es.properties
janusgraph-cql-es.properties文件配置示例如下:
gremlin.graph=org.janusgraph.core.JanusGraphFactory
storage.backend=cql
storage.hostname=192.156.193.222
storage.cql.keyspace=janusgraphdev
index.search.backend=elasticsearch
index.search.hostname=192.156.193.222
27.3、创建Spring Bean文件JanusgraphBean.java
JanusgraphBean.java内容如下:
import com.esint.api.utils.PropertiesUtil;
import org.janusgraph.core.JanusGraph;
import org.janusgraph.core.JanusGraphFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JanusgraphBean {
private String confFile = PropertiesUtil.getPropValue("janusgraph.conf.file");
public @Bean
JanusGraph client(){
return JanusGraphFactory.open(confFile);
}
}
27.4、一些Java使用JanusGraph的示例
27.4.1、查询节点的周边的边与节点
/**
* 根据身份证号找到节点并且查询该节点的周边节点.
*/
@Test
public void queryVertexByIdCardTest() throws Exception {
JanusGraph graph = JanusgraphBean.getJanusGraph();
JanusGraphTransaction transaction = graph.newTransaction();
GraphTraversalSource g = transaction.traversal();
GraphTraversal<Vertex, Path> traversal = g.V()
.has("personId", "120221198209293016")
.outE().inV().path()
.by(__.valueMap().with(WithOptions.tokens))
.by(__.valueMap().with(WithOptions.tokens));
while (traversal.hasNext()) {
Path thisobj = traversal.next();
// 分别截取图库查询返回结果中的三部分,左节点、边、右节点
Map<String, List> lv = thisobj.get(0);
Map<String, List> relation = thisobj.get(1);
Map<String, List> rv = thisobj.get(2);
System.out.println(JSON.toJSONString(lv));
System.out.println(JSON.toJSONString(relation));
System.out.println(JSON.toJSONString(rv));
}
//关闭查询
g.close();
//关闭查询事务
transaction.close();
}
27.4.2、查询节点
/**
* 如果节点不存在则创建节点并返回
* @param graph JanusGraph实例对象
* @param key 节点key
* @param value 节点value
* @return 节点
*/
public static Vertex getVertex(String key, String value) {
JanusGraph graph = JanusgraphBean.getJanusGraph();
JanusGraphTransaction transaction = graph.newTransaction();
GraphTraversalSource g = transaction.traversal();
Vertex v;
GraphTraversal<?, Vertex> graphTraversal = graph.traversal().V().has(key, value);
if (graphTraversal.hasNext()) {
v = graphTraversal.next();
} else {
v = graph.addVertex("person");
v.property(key, value);
}
return v;
}
27.4.2、查询边
/**
* 获得边
* @param key 边的key
* @param value 边的value
* @return 边
*/
public static Edge GetEdge(String key, String value){
JanusGraph graph = JanusgraphBean.getJanusGraph();
JanusGraphTransaction transaction = graph.newTransaction();
GraphTraversalSource g = transaction.traversal();
Edge e = null;
GraphTraversal<?, Edge> graphTraversal = graph.traversal().E().has(key, value);
if (graphTraversal.hasNext()){
e = graphTraversal.next();
}
return e;
}
27.4.3、判断边是否存在
/**
* 判断边是否存在
* @param key 边的key
* @param value 边的value
* @return 是否存在 true:存在 false:不存在
*/
public static boolean edgeIsExist(String key, String value) {
JanusGraph graph = JanusgraphBean.getJanusGraph();
JanusGraphTransaction transaction = graph.newTransaction();
GraphTraversalSource g = transaction.traversal();
boolean exist = false;
GraphTraversal<?, Edge> graphTraversal = graph.traversal().E().has(key, value);
if (graphTraversal.hasNext()) {
exist = true;
}
return exist;
}
27.4.4、删除节点
/**
* 删除节点
* @param graph JanusGraph实例对象
* @param key 节点的key
* @param value 节点的value
*/
public static void deleteVertex(JanusGraph graph,String key, String value){
GraphTraversal<Vertex, Vertex> traversal = graph.traversal().V()
.has(key, value);
if(traversal.hasNext()){
Vertex thisobj = traversal.next();
thisobj.remove();
}
}
27.4.5、删除边
/**
* 删除边
* @param graph JanusGraph实例对象
* @param key 边的key
* @param value 边的value
*/
public static void deleteEdge(JanusGraph graph,String key, String value){
GraphTraversal<Edge, Edge> traversal = graph.traversal().E()
.has(key, value);
if(traversal.hasNext()){
Edge thisobj = traversal.next();
thisobj.remove();
}
}
27.4.6、获得节点双向链接所有边的数量
/**
* 获得节点双向链接所有边的数量
* @param graph JanusGraph实例对象
* @param key 节点的key
* @param value 节点的value
* @return 边的数量
*/
public static long getVertexBothEgdeCount(JanusGraph graph,String key, String value){
long number = 0L;
GraphTraversal<Vertex, Long> traversal = graph.traversal().V()
.has(key, value)
.bothE().count();
if (traversal.hasNext()) {
number = traversal.next();
}
return number;
}
27.4.7、获得节点in方向所有边的数量
/**
* 获得节点in方向所有边的数量
* @param graph JanusGraph实例对象
* @param key 节点的key
* @param value 节点的value
* @return 节点的数量
*/
public static long getVertexInEgdeCount(JanusGraph graph,String key, String value){
long number = 0L;
GraphTraversal<Vertex, Long> traversal = graph.traversal().V()
.has(key, value)
.inE().count();
if (traversal.hasNext()) {
number = traversal.next();
}
return number;
}
27.4.8、获得节点Out方向所有边的数量
/**
* 获得节点Out方向所有边的数量
* @param graph JanusGraph实例对象
* @param key 节点的key
* @param value 节点的value
* @return 节点的数量
*/
public static long getVertexOutEgdeCount(JanusGraph graph,String key, String value){
long number = 0L;
GraphTraversal<Vertex, Long> traversal = graph.traversal().V()
.has(key, value)
.outE().count();
if (traversal.hasNext()) {
number = traversal.next();
}
return number;
}
27.4.9、根据边的属性获得节点信息
/**
* 根据边的属性获得节点信息
* @param graph JanusGraph实例对象
* @param ikey 边的index
* @param value 边的value
* @return 节点集合
*/
public static List<Vertex> getVertexByEgdeProperty(JanusGraph graph,String ikey, String value){
List<Vertex> vertexList = graph.traversal().E()
.has(ikey, value)
.bothV()
.dedup()
.toList();
return vertexList;
}
27.4.10、根据边的属性获得边左侧的节点
/**
* 根据边的属性获得边左侧的节点.
* @param graph JanusGraph实例对象
* @param ikey 边的index
* @param value 边的value
* @return 边的左侧节点
*/
public static Vertex getLeftVertexByEdge(JanusGraph graph, String ikey, String value){
GraphTraversal<Edge, Vertex> traversal = graph.traversal().E()
.has(ikey, value)
.outV();
Vertex v = null;
if (traversal.hasNext()){
v = traversal.next();
}
return v;
}
27.4.11、根据边的属性获得右侧的节点
/**
* 根据边的属性获得右侧的节点
* @param graph JanusGraph实例对象
* @param ikey 边的index
* @param value 边的value
* @return 边的右侧节点
*/
public static Vertex getRightVertexByEdge(JanusGraph graph, String ikey, String value){
GraphTraversal<Edge, Vertex> traversal = graph.traversal().E()
.has(ikey, value)
.inV();
Vertex v = null;
if (traversal.hasNext()){
v = traversal.next();
}
return v;
}
27.4.12、获得节点属性的值
/**
* 获得节点属性的值.
* @param vmap 节点的属性结合对象
* @param key 节点的key
* @return 值
*/
public static String getVertexPropertie(Map<String, List> vmap, String key) {
String value = "";
if(vmap == null) {
return value;
}
//是否包含key值
if(vmap.containsKey(key)){
List list = vmap.get(key);
if(list.size() > 0){
value = list.get(0).toString();
}
}
return value;
}
27.4.13、获得节点属性的值-多态1
/**
* 获得节点属性的值.
* @param vmap 节点的属性结合对象
* @param key 节点的key
* @param defaultStr 默认值
* @return 值
*/
public static String getVertexPropertie(Map<String, List> vmap, String key,String defaultStr) {
String value = defaultStr;
if(vmap == null){
return value;
}
//是否包含key值
if(vmap.containsKey(key)){
List list = vmap.get(key);
if(list.size() > 0){
Object obj = list.get(0);
if(obj instanceof Date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = (Date)obj;
if(date.getTime() != DateUtil.getMinDate().getTime()){
value = sdf.format(date);
}
}else if(!"".equals(obj)){
value = obj.toString();
}
}
}
return value;
}
27.4.14、获得节点属性的值-多态2
/**
* 获得节点属性的值.
* @param vmap 节点的属性结合对象
* @param key 节点的key
* @return 值
*/
public static String getVertexPropertieObject(Map<Object, List> vmap, String key) {
String value = "";
if(vmap == null){
return value;
}
//是否包含key值
if(vmap.containsKey(key)){
List list = vmap.get(key);
if(list.size() > 0){
value = list.get(0).toString();
}
}
return value;
}