获取 NoFastSuchElementException,当我在带有 java 的 gremlin 查询中使用 valueMap() 时

Getting NoFastSuchElementException, when I use valueMap() in gremlin query with java

GraphTraversal<Vertex, Map<String, Object>> tsList = traversalSource.V().has("request","id_key",114).valueMap();        
while(tsList.hasNext())
{
System.out.println(tsList.next().get("status")); //prints result
System.out.println(tsList.next().get("tree_id_key")); //prints result
System.out.println(tsList.next().get("username")); //here throws Exception for any vertex.
System.out.println(tsList.next().get("tree_status"));
}

当我 运行 上述查询时,我正在获取任何第一个和第二个 propertyKey 的值。但是在得到两个键的答案后,它会为任何 propertyKey 抛出 NoFastSuchElementException...请帮助我..我该如何解决这个问题?

但是使用下面的查询我能够得到答案:

GraphTraversal<Vertex, Map<String, Object>> tsList = traversalSource.V().has("request","id_key",114).values("status","tree_id_key","username","tree_status");       
while(tsList.hasNext())
{
System.out.println(tsList.next());//prints "status" value
System.out.println(tsList.next());//prints "tree_id_key" value
System.out.println(tsList.next());//prints "username" value
System.out.println(tsList.next());//prints "tree_status" value
}

更新:

GraphTraversal<Vertex, Map<String, Object>> ts = traversalSource.V().has("request","id_key",113).valueMap();        
while(ts.hasNext())
{
Map<String, Object> tsList=ts.next();
SuiteIdKey=(long)((ArrayList)tsList.get("suiteKey")).get(0);
seqe=(int)((ArrayList)tsList.get("sequence")).get(0);
}

在上面的查询中,ts 会 return 很多行,对于每一行我都会得到 suiteIdkey,seqe..我能够得到答案。但是 tsList 是 Map<>,当我这样使用 =(long)tsList.get("suiteKey") 时,它不是直接 returning 答案,没有 ArrayList。这是正确的方法吗?请帮助我。

你在这两次遍历中要求两种不同的东西。第一个带有 valueMap() 的要求将顶点转换为 Map,因此您不想在该循环中继续调用 next()。只要做:

Map<String, List<Object>> m = traversalSource.V().has("request", "id_key", 114).
                                                  valueMap().next();        
System.out.println(m.get("status").get(0)); 
System.out.println(m.get("tree_id_key").get(0)); 
System.out.println(m.get("username").get(0)); 
System.out.println(m.get("tree_status").get(0));

请记住,我假设您的遍历总是 returns 一个顶点...如果不是这样,请考虑这一点。

在您执行的第二次遍历中 values() 您要求 Gremlin 转换并获取该顶点上那些特定属性的值并将它们流出,因此您需要迭代多次调用 next。

请注意,通常不推荐返回整个顶点对象。它有点类似于 SQL 中的 SELECT * FROM table。最好只获取您想要获取的字段,然后摆脱 Map<String, List<Object>>:

的丑陋 multi-属性 问题
Map<String, Object> m = traversalSource.V().has("request", "id_key", 114).
                                            project('s`,'tik', 'u', 'ts').
                                              by('status').
                                              by('tree_id_key').
                                              by('username')
                                              by('tree_status').
                                            next();        
System.out.println(m.get("s")); 
System.out.println(m.get("tik")); 
System.out.println(m.get("u")); 
System.out.println(m.get("ts"));