【问题标题】:Getting NoFastSuchElementException, when I use valueMap() in gremlin query with java获取 NoFastSuchElementException,当我在使用 java 的 gremlin 查询中使用 valueMap() 时
【发布时间】:2017-05-17 19:50:54
【问题描述】:
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。这是正确的方法吗?请帮助我。

【问题讨论】:

    标签: java cassandra titan gremlin tinkerpop3


    【解决方案1】:

    你在这两个遍历中要求两个不同的东西。第一个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。

    请注意,通常不推荐返回整个顶点对象。它有点类似于 SQL 中的SELECT * FROM table。最好只获取您想要获取的字段,然后摆脱Map&lt;String, List&lt;Object&gt;&gt; 丑陋的多属性问题:

    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"));
    

    【讨论】:

    • 嗨,斯蒂芬,谢谢你的回答..它现在正在工作..但我有一些疑问..我已经更新了关于这个的问题..你能帮我吗??
    • 是的 - 因为multi-properties,你得到了List - 我稍微更新了我的答案。
    • @stephen..我用 cardinality.SINGLE 创建了我的 id_key,username 属性,现在当我尝试使用 valueMap("my id_key","username") 检索时,它正在返回列表。 .so 将 valueMap 总是返回列表,因为多属性,不管 cardinality.SINGLE 还是 cardinality.LIST? (和 cardinality.LIST 只能有相同属性键的值列表)
    • 我相信是这样 - 无论如何,这都会使您解析的结果保持一致
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    相关资源
    最近更新 更多