我需要遍历路径,并且将根据路径的某些中间顶点中的数据来选择特定路径。
我在GremlinPipeLine中遇到了store()函数来将数据存储在列表中,或者可以使用groupBy函数将数据存储在map中。但我的问题是如何在遍历的后面部分使用存储的数据,其中确切的路径需要根据这些数据找出答案。
A - > B - > C-> D - > E
*-> F -> G ->I -> J*
*-> L -> M-> N -> O*
在上面的示例中,节点B具有属性(Route),类似地,节点F和L具有属性(Route),因此当遍历器位于节点E时,根据节点B的属性(Route)确定下一个节点,即选择具有相同路线编号的一个(F或L)。
那么我们如何使用GremlinPipeLine来做到这一点。
尝试使用固定"路线"在E点使用过滤器和PipeLineFunction,但是无法使用' Route' E的B值。
任何帮助将不胜感激。
答案 0 :(得分:0)
我的描述并不完全清楚。也许你可以包含一个小样本图。不过可能有以下帮助:
route = null; g.v('A').out.sideEffect{route = it.route}.out.out.out.out.filter{it.route == route}.out.out.out
这个想法是你只是filter
遍历遍历的分支,这些分支不同意route
A
的第一个邻居的B
属性route
。请注意,如果A
有多个邻居,g = new TinkerGraph()
ids = ['A','B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O']
ids.each{g.addVertex(it)}
g.addEdge(g.v('A'), g.v('B'), 'x')
g.addEdge(g.v('B'), g.v('C'), 'x')
g.addEdge(g.v('C'), g.v('D'), 'x')
g.addEdge(g.v('D'), g.v('E'), 'x')
g.addEdge(g.v('E'), g.v('F'), 'x')
g.addEdge(g.v('F'), g.v('G'), 'x')
g.addEdge(g.v('G'), g.v('I'), 'x')
g.addEdge(g.v('I'), g.v('J'), 'x')
g.addEdge(g.v('E'), g.v('L'), 'x')
g.addEdge(g.v('L'), g.v('M'), 'x')
g.addEdge(g.v('M'), g.v('N'), 'x')
g.addEdge(g.v('N'), g.v('O'), 'x')
g.v('B').route = 1
g.v('F').route = 0
g.v('L').route = 1
将被多次分配。
使用以下示例
v[O]
我得到{{1}}
答案 1 :(得分:0)
使用GremlinPipeline的响应:
public Graph createGraph()
{
Graph g = TinkerGraphFactory.createTinkerGraph();
String [] ids ={"A","B","C","D","E","F","G","H","I","J","L","M","N","O"};
int i= 0;
for (String s:ids)
{
Vertex v = g.addVertex(s);
i++;
v.setProperty("route",i);
}
g.getVertex("L").setProperty("route",2); // If you want "F" as the next vertex from E then mark the route of "F" as 2.
g.addEdge(1,g.getVertex("A"),g.getVertex("B"),"x") ;
g.addEdge(2,g.getVertex("B"),g.getVertex("C"),"x") ;
g.addEdge(3,g.getVertex("C"),g.getVertex("D"),"x") ;
g.addEdge(4,g.getVertex("D"),g.getVertex("E"),"x") ;
g.addEdge(5,g.getVertex("E"),g.getVertex("F"),"x") ;
g.addEdge(6,g.getVertex("F"),g.getVertex("G"),"x") ;
g.addEdge(17,g.getVertex("G"),g.getVertex("I"),"x") ;
g.addEdge(18,g.getVertex("I"),g.getVertex("J"),"x") ;
g.addEdge(19,g.getVertex("E"),g.getVertex("L"),"x") ;
g.addEdge(20,g.getVertex("L"),g.getVertex("M"),"x") ;
g.addEdge(21,g.getVertex("M"),g.getVertex("N"),"x") ;
g.addEdge(22,g.getVertex("N"),g.getVertex("O"),"x") ;
return g;
}
public void traverse(Graph graph)
{
final Map<String,Object> cache = new HashMap<String, Object>();
final String attribute="route";
GremlinPipeline pipes = new GremlinPipeline(graph.getVertex("A")).out().sideEffect(new PipeFunction<Vertex,Vertex>() {
public Vertex compute(Vertex vertex)
{
cache.put(attribute,vertex.<Object>getProperty(attribute));
return vertex;
}
}).out().out().out().out().filter(new PipeFunction<Vertex,Boolean>() {
public Boolean compute(Vertex vertex)
{
if (vertex.getProperty(attribute) == cache.get(attribute))
{
return true;
}
else
{
return false;
}
}
}).out().out().out().path();
while(pipes.hasNext())
{
ArrayList<Vertex> vertices = (ArrayList<Vertex>)pipes.next();
for (Vertex v : vertices)
{
System.out.print("->"+v.getId());
}
System.out.println();
}
}