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 に答える