1

我有一个 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 查询语言的解决方案,有什么帮助吗?

4

1 回答 1

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

以上正确工作。

于 2013-10-24T12:11:13.193 回答