1
votes

I have a Neo4j graph database which maps a file system structure consisting of nodes representing folders and files. Each node has a FATHER_OF and a CHILD_OF relationship.

Now I need to create a TreeNode structure in Java starting from the Neo4j graph: currently I implemented a breadth first print of the NEO4J structure as follows:

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

Now I'm trying to create a Tree using the above breadth-first traverser but can't figure out how to properly assign the correct parent to each node.

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

I hoped there was something like directoryPath.endNode().getParent() but apparently there isn't. I'm searching for a solution which doesn't require me to use Cypher query language, any help?

1

1 Answers

0
votes

Ok found out, just need a HashMap to map Neo4j node id's to TreeNode objects:

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

then the rest becomes:

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

The above correctly works.