2017-05-17 29 views
1
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 ...請幫助我..如何解決這個問題?入門NoFastSuchElementException,當我在小鬼查詢中使用valueMap()與Java

但使用下面的查詢我能夠得到答案:

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。這是正確的方式嗎?請幫助我。

回答

2

你在這兩次遍歷中要求兩個不同的東西。第一個與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<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")); 
+0

嗨斯蒂芬,感謝您的answer..it工作now..but我有一些懷疑..我已經更新了有關這個問題..你可以幫我解決這個問題? – User12345

+1

是的 - 你因爲[多屬性](http://tinkerpop.apache.org/docs/current/reference/#vertex-properties)而得到'List' - 我稍微更新了我的答案。 –

+0

@ stephen ..我創建了我的id_key,用戶名屬性cardinality.SINGLE,現在當我試圖檢索使用valueMap(「我的id_key」,「用戶名」),它返回列表..所以valueMap總是返回列表,因爲多屬性,無論cardinality.SINGLE還是cardinality.LIST? (和cardinality.LIST只能有相同的屬性值的值列表) – User12345