我有一个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查询语言的解决方案,有什么帮助吗?
答案 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);
}
以上是正确的。