2017-07-07 145 views
-2

我想知道如何在Java控制檯中返回節點名稱而不是節點ID。Neo4J - 返回節點名稱而不是ID

下面的輸出顯示在控制檯:

enter image description here

所需的輸出應該是這樣的:

enter image description here

只是沒有所有的信息,但只與節點名稱(其中機場名稱相同)。

我的Java代碼如下所示:

package com.routesNeo4j; 

import org.neo4j.driver.v1.*; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by e on 11.06.17. 
*/ 
public class Neo4JRouting implements AutoCloseable, Neo4J_Connector { 

    static Driver driver; 


    public Neo4JRouting(String startAirport, String destinationAirport, StatementResult shortestPath) { 

     driver = GraphDatabase.driver("bolt://ec2-13-58-101-13.us-east-2.compute.amazonaws.com:7687", 
       AuthTokens.basic("neo4j", "Einloggen_123")); 

     try(Session session = driver.session()) { 

      shortestPath = session.run("MATCH (a:" + startAirport.toLowerCase() + "), (b:" + destinationAirport.toLowerCase() 
      + "), p = allShortestPaths((a)-[r*1..4]-(b)) UNWIND rels(p) AS rel RETURN nodes(p), sum(rel.weight) " + 
        "AS weight ORDER BY sum(rel.weight)"); 


      List<Record> storeList = storeList(shortestPath); 
      while (shortestPath.hasNext()) { 
       System.out.println(shortestPath.next().toString()); 
      } 
      System.out.println(storeList); 


     } catch (Exception e) { 

      e.printStackTrace(); 

     } 

    } 

    public List<Record> storeList(StatementResult statementResult) { 

     List<Record> list = new ArrayList<>(); 
     while (statementResult.hasNext()) { 

      list.add(statementResult.next()); 

     } 

     return list; 

    } 

    @Override 
    public Driver runDriver(String user, AuthToken basicAuthToken) throws Exception { 
     return null; 
    } 

    @Override 
    public void close() throws Exception { 

    } 

} 

我很期待你的答案。非常感謝!

回答

0

您要返回的每一行都包含一個節點列表和一個權重。這就是你在查詢中所要求的,這就是你所得到的。所以你必須將結果「解壓」成你所需要的格式。

夫婦的代碼片段來說明我的意思:

 StatementResult vResult = vSession.run(aCypher); 

     while (vResult.hasNext()) { 
      Record vRecord = vResult.next(); 

      vMutator.pushNode("row"); 

      for (Pair <String, Value> vListEntry : vRecord.fields()) { 
       process_listentry(vSession, vMutator, vListEntry.key(), vListEntry.value()); 
      } 

      vMutator.popNode(); // row 
     } 

,然後在process_listentry:

private void process_listentry(Session vSession, IHDSMutator vMutator, String vKey, Value vValue) { 
... 
    else if (vValue.type().equals(vSession.typeSystem().NODE())){ 
     vMutator.pushNode(vKey); 
     vMutator.addNode("_id", Long.toString(vValue.asNode().id())); 
     for (String lLabel : vValue.asNode().labels()) { 
      vMutator.addNode("_label", lLabel); 
     } 
     for (String lKey : vValue.asNode().keys()) { 
      Value lValue = vValue.asNode().get(lKey); 
      process_listentry(vSession, vMutator, lKey, lValue); 
     } 
     vMutator.popNode(); 
    } 

... 但它取決於你在查詢問什麼和因此不得不拆包...

希望這會有所幫助, Tom

+0

IHDSMutator < - 這是什麼?查看它,我沒有找到任何包或lib的。你能解釋一下嗎? –

+0

這只是我用來返回結果的一個示例結構。它實際上是一個類似於XML文檔的分層數據結構(HDS)。這不是我的例子的重點,關鍵是你必須處理從查詢中得到的結果,以便從中提取實際數據。事實上,如果您只想將結果打印到控制檯,您甚至不需要一個結構來保留結果。 –

相關問題