嗨,我对 gremlin 有点陌生,并试图通过查找两个节点之间的所有路径来实现一些解决方案。在 gremlin 控制台上的简单查询中,我可以使用以下查询来做到这一点:
(Name of the first Node).loop(1){it.loops<100}{true}.has('name', (Name of the second node)).path{it.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();
谢谢, 萨吉尔
最佳答案
您的查询对我来说没有多大意义,但描述有帮助。下面是一个使用 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 个条目:
- [马可,洛普]
- [马科、乔希、洛普]
如果将 Groovy 转换为 Java 是最大的问题,那么您绝对应该检查一下:Converting Gremlin Groovy to Gremlin Java
关于java - 在java中使用gremlin获取两个节点之间的所有路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30212204/