获取 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"));
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>>
:
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"));