在java中使用gremlin获取两个节点之间的所有路径
Posted
技术标签:
【中文标题】在java中使用gremlin获取两个节点之间的所有路径【英文标题】:Fetching all the paths between two nodes using gremlin in java 【发布时间】:2015-05-13 10:29:46 【问题描述】:嗨,我对 gremlin 有点陌生,并试图通过查找两个节点之间的所有路径来解决一些问题。在 gremlin 控制台上的简单查询中,我可以使用此查询来做到这一点:
(Name of the first Node).loop(1)it.loops<100true.has('name', (Name of the second node)).pathit.name
但是当我试图从 java 方法中获取它时,我遇到了很多问题,比如:
-- 不知道将查询准确放在哪里? -- 什么样的数据结构适合接收行数组。 -- 如何从图中收集第一个节点和第二个节点。
这里我尝试过继续,但没有任何线索:
Graph g = new OrientGraph(AppConstants.GRAPH_LOCATION);
List<String> vertexList = new ArrayList<String>();
try
for (Vertex v : g.getVertices())
String vertexName = v.getProperty("name");
vertexList.add(vertexName);
return vertexList;
catch (final Exception ex)
throw new AppSystemException(ex);
finally
g.shutdown();
谢谢, 萨吉尔
【问题讨论】:
【参考方案1】:您的查询对我来说没有多大意义,但描述有所帮助。下面是一个示例,使用 TinkerGraph 查找 marko
和 lop
之间的所有路径:
final Graph g = TinkerGraphFactory.createTinkerGraph();
List<List> names = new ArrayList<>();
new GremlinPipeline<Vertex, ArrayList<Vertex>>(g).V().has("name", "marko").as("x").out().loop("x",
new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>()
@Override
public Boolean compute(LoopPipe.LoopBundle<Vertex> loopBundle)
return loopBundle.getLoops() < 100;
, new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>()
@Override
public Boolean compute(LoopPipe.LoopBundle<Vertex> loopBundle)
return "lop".equals(loopBundle.getObject().getProperty("name"));
).has("name", "lop").path(new PipeFunction<Vertex, String>()
@Override
public String compute(final Vertex vertex)
return vertex.getProperty("name");
).fill(names);
names
列表随后将填充以下 2 个条目:
-
[marko, lop]
[马克,乔希,洛普]
如果将 Groovy 转换为 Java 是最大的问题,您绝对应该检查一下:Converting Gremlin Groovy to Gremlin Java
【讨论】:
至于“你的查询去哪里”和“如何收集数据”——你在控制台中的“查询”实际上只是一个Iterator
——在你的java中简单地对待它代码。您还可以创建一个基于 groovy 的库,其中包含图形遍历。然后从您的 java 库中引用它。或者只是让你的 groovy 图遍历与你的 .groovy
文件共存于 .java
文件中。混合项目很容易。
你能说明一下 as("x") 和 .out() 和 .loop("x" ... 的值是多少??我的意思是 x = ?
x
是循环遍历开始的顶点。在我的第二条路径示例中,第一个循环中的marko
和第二个循环中的josh
。它与.loop(1)
基本相同,但它使用了一个命名步骤而不是多个步骤。
您好丹尼尔,回复非常有帮助。但是对于具有超过 10k 个节点的图形数据库,我所面临的问题不适用于此循环。您能否在没有循环的情况下参考类似的查询...对吗? g.v(100).out.loop(1) it.object != g.v(200) .path ?
存在“marko”和“lop”被两个字符串变量替换的问题。它正在返回空白数组!以上是关于在java中使用gremlin获取两个节点之间的所有路径的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Gremlin/Titan/TinkerPop3 更新特定的边缘属性?
如何从顶点scala gremlin获取所有传入/传出边的所有顶点