2013-10-24 56 views
0

我有一個Neo4j圖形數據庫,它映射由表示文件夾和文件的節點組成的文件系統結構。 每個節點都有一個FATHER_OF和一個CHILD_OF關係。寬度第一個Neo4j樹遍歷和TreeNode創建

現在我需要在Java中創建樹節點結構從Neo4j的圖形開始:目前我實現了Neo4j的結構的廣度優先打印如下:

public Traverser getTraverser() 
    { 
     Transaction tx = graphDb.beginTx(); 
     Traverser traverser = traverseStorage(rootNode); 
     return traverser; 
    } 

    private static Traverser traverseStorage(final Node startNode) { 
     TraversalDescription td = Traversal.description() 
       .breadthFirst() 
       .relationships(GraphStorage.RelTypes.FATHER_OF, Direction.OUTGOING); 
     return td.traverse(startNode); 
    } 

現在我試圖創建一個樹使用上面的廣度優先遍歷器,但不知道如何正確地分配正確的父節點到每個節點。

TreeNode root = new DefaultTreeNode("root", null); 
    Traverser traverser = graphStorage.getTraverser(); 
    TreeNode parent = root; 
    for (Path directoryPath : traverser) { 
      DefaultTreeNode tmp1 = new DefaultTreeNode((String)directoryPath.endNode().getProperty("name"), parent); 
    } 

我希望有像directoryPath.endNode()。getParent()這樣的東西,但顯然沒有。 我正在尋找一個不需要我使用Cypher查詢語言的解決方案,有什麼幫助?

回答

0

好發現,只需要一個HashMap來Neo4j的節點ID映射到TreeNode對象:

HashMap<Long, TreeNode> treeNodeMap = new HashMap(); 

那麼剩下的就變成了:

TreeNode root = new DefaultTreeNode("root", null); 
    Traverser traverser = graphStorage.getTraverser(); 
    TreeNode parent = root; 
    Relationship parentRelationship = directoryPath.endNode().getSingleRelationship(
        GraphStorage.RelTypes.CHILD_OF, Direction.OUTGOING); 
      if (parentRelationship != null) { 
       Node parentFileNode = parentRelationship.getEndNode(); 
       if (parentFileNode != null) { 
        long parentId = parentFileNode.getId(); 
        parent = treeNodeMap.get(new Long(parentId)); 
       } 
       DefaultTreeNode tmp1 = new DefaultTreeNode((String)directoryPath.endNode().getProperty("name"), parent); 
       treeNodeMap.put(new Long(directoryPath.endNode().getId()), tmp1); 
      } 

以上正確工作。