java - 当我在 java 的 gremlin 查询中使用 valueMap() 时,出现 NoFastSuchElementException

标签 java cassandra titan gremlin tinkerpop3

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 将返回许多行,对于每一行我将得到 suiteIdkey,seqe..我能够得到答案。但是 tsList 是 Map<>,当我像这样使用 =(long)tsList.get("suiteKey") 时,它不会直接返回答案,没有 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));

请记住,上面我假设您的遍历总是返回一个顶点...否则如果情况不正确,请考虑这一点。

在你的第二次遍历中你所做的values()您要求 Gremlin 转换抓取该顶点上这些特定属性的值并将它们流式传输出来,因此您需要通过多次调用 next 进行迭代。

请注意,通常不建议返回整个顶点对象。它有点类似于 SELECT * FROM table在 SQL 中。最好只获取您想要获取的字段,这样就可以摆脱 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"));

关于java - 当我在 java 的 gremlin 查询中使用 valueMap() 时,出现 NoFastSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44033634/

相关文章:

python - 从 Python 使用 Titan Graph 数据库

java - 从列表 Activity 中删除 ContentView

java - Thread.sleep() 在无限循环中有什么好处吗?

eclipse - 在 Eclipse 中链接 Cassandra 和 Thrift 源时遇到问题

linux - 在 cassandra 0.8.2 sstableleader 中如何使用 -i 或 --ignore 选项?

performance - 使用 Vnode 重新平衡 Cassandra 环

java - 如何在 Titan DB 1.0.0 版中获取顶点或边元素的属性

scala - 是否可以为顶点中的标签建立索引

java - 是否可以重新初始化类中的静态可变字段?

java - 如何在 Spring Boot 中手动验证用户身份?