【问题标题】:neo4j - traversing structure to build XMLneo4j - 构建 XML 的遍历结构
【发布时间】:2012-12-07 06:15:28
【问题描述】:

我有一个由活动目录生成的组织的 neo4j 图。

唯一存在的关系是 MANAGE,节点 1 是根节点(组织的顶部),所有其他成员最终都通过 MANAGE 关系向节点 1 报告。

我还没有接触过 Neo4j 遍历,但我想提供一个以逗号分隔的用户名列表,并生成一个由

组成的树结构

根节点

我已经可以在 Neo4j 中获得 LCA,我只需要弄清楚从那里去哪里。

        String users = "tom,sarah,liam";
    List<Node> nodeSet = new ArrayList<Node>();
    String usernames[] = users.split(",");
    for (String user : usernames) { 
        Node found = nodeIndex.get("username", user).getSingle();
        if (found != null) nodeSet.add(found);
    }

    Node lca = getLCA(nodeSet);

private Node getLCA(List<Node> nodes) { 
    RelationshipExpander expander = Traversal.expanderForTypes(RelTypes.MANAGE, Direction.INCOMING);

    return AncestorsUtil.lowestCommonAncestor(nodes, expander);
}

因此,如果我提供列表“sarah,tom,liam”,则会创建以下结构:

          Root
           |
           | 
           |
           John
           |
           Jane
         /      \ 
   Sarah       Jerome
               /    \ 
             Liam    Tom

我想在 XML 或 JSON 中这样做:(下面的 XML 示例)

<user>
    <name>Root</name>
    <children>
        <user>
            <name>John</name>
            <children>
                <user>
                    <name>Jane</name>
                    <children>
                        <user>
                            <name>Sarah</name>
                        </user>
                        <user>
                            <name>Jerome</name>
                            <children>
                                        <user>
                                            <name>Liam</name>
                                        </user>
                                <user>
                                    <name>Tom</name>
                                </user>
                            </children>
                        </user>
                    </children>
                </user>
            </children>
        </user>
    </children>
</user> 

有人可以指出我从哪里开始的正确方向吗?

【问题讨论】:

  • 请粘贴您“在 Neo4j 中获取 LCA”的部分代码/步骤。
  • @ulkas 我已经把它贴在上面了。
  • 我已经创建了一些遍历,它们可以获取 root -> LCA 和 LCA -> 每个用户,但我不确定我是否可以将其编写为一个遍历器,或者我将如何加入遍历结果。跨度>

标签: algorithm graph neo4j graph-theory graph-algorithm


【解决方案1】:

类似的东西:http://console.neo4j.org/r/canhtg

start n=node(0) 
match path=n-[:MANAGE*]-m 
with nodes(path) as nodes, length(path) as l 
return head(nodes), head(tail(nodes)),tail(tail(nodes)),l

它的作用是:

  • 你匹配从你的起始节点到任意长度的路径,最后触及你(子)图中的所有节点
  • 您将路径的节点聚合到一个名为节点的集合中
  • 您从该集合中分别返回第一个、第二个、第三个等元素

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2014-11-14
    • 2011-01-13
    相关资源
    最近更新 更多