广度第一个Neo4j树遍历和TreeNode创建

时间:2013-10-24 11:37:27

标签: java database graph neo4j

我有一个Neo4j图形数据库,它映射由表示文件夹和文件的节点组成的文件系统结构。 每个节点都有一个FATHER_OF和一个CHILD_OF关系。

现在我需要从Neo4j图开始用Java创建一个TreeNode结构:目前我实现了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查询语言的解决方案,有什么帮助吗?

1 个答案:

答案 0 :(得分: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);
            }

以上是正确的。