2017-07-07 141 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)。这不是我的例子的重点,关键是你必须处理从查询中得到的结果,以便从中提取实际数据。事实上,如果您只想将结果打印到控制台,您甚至不需要一个结构来保留结果。 –

相关问题