使用Cypher在Neo4j中创建简单的八叉树结构

使用Cypher在Neo4j中创建简单的八叉树结构,neo4j,cypher,octree,Neo4j,Cypher,Octree,我想使用Cypher在Neo4j中创建一个八叉树结构。我想创建与下图类似的内容: 关于如何在不必“手动”创建每个节点和关系的情况下实现这一点,有什么想法吗?我不确定cypher一个人是否可以做到,但您可以使用编程语言并连接到neo4j来创建节点和关系。 例如,在PHP中: function create_children($parent){ print "\n$parent: "; for ($i=0; $i<=7;$i++) { $node_id =

我想使用Cypher在Neo4j中创建一个八叉树结构。我想创建与下图类似的内容:


关于如何在不必“手动”创建每个节点和关系的情况下实现这一点,有什么想法吗?

我不确定cypher一个人是否可以做到,但您可以使用编程语言并连接到neo4j来创建节点和关系。
例如,在PHP中:

function create_children($parent){

    print "\n$parent: ";
    for ($i=0; $i<=7;$i++) {
        $node_id = (int) "$parent"."$i";
        $children[] = $node_id;
        print "$node_id,";
        // create children nodes
        // CREATE (child:node) SET node_id = $node_id 
        //create relationship here
        // MATCH (parent:node) where node_id = $parent
        // CREATE (parent)-[r:parent_of]->(child)
    }
    return $children;

}


function create_tree ($root, $depth) {
    if ($depth ==0) return;
    else{
        $children = create_children($root);
        $depth--;
        foreach ($children as $child) {
            create_tree($child, $depth);
        }
    }
}


// MAIN

// CREATE (parent:node) SET node_id=0;
create_tree(0,3);

让我知道你是否在寻找这一点,我不确定cypher一个人是否能做到,但你可以使用编程语言并连接到neo4j来创建节点和关系。
例如,在PHP中:

function create_children($parent){

    print "\n$parent: ";
    for ($i=0; $i<=7;$i++) {
        $node_id = (int) "$parent"."$i";
        $children[] = $node_id;
        print "$node_id,";
        // create children nodes
        // CREATE (child:node) SET node_id = $node_id 
        //create relationship here
        // MATCH (parent:node) where node_id = $parent
        // CREATE (parent)-[r:parent_of]->(child)
    }
    return $children;

}


function create_tree ($root, $depth) {
    if ($depth ==0) return;
    else{
        $children = create_children($root);
        $depth--;
        foreach ($children as $child) {
            create_tree($child, $depth);
        }
    }
}


// MAIN

// CREATE (parent:node) SET node_id=0;
create_tree(0,3);

让我知道这是否是您想要的

如果您事先知道树的高度,您可以使用Cypher生成树。为了简单起见,我生成了二叉树(分支因子为2)

这将生成以下树:

说明:对于k个级别的树,我们将
分支
变量复制k-1次,然后展开每个列表。这将创建笛卡尔积,从而生成叶节点。对于k级的(完整)二叉树,这将导致2^(k-1)个叶节点。(这也适用于具有8^(k-1)级的八叉树。)

我们将级别的编号与下划线结合起来,为每个级别创建唯一的变量名。可以按如下方式查询ID:

WITH 0 as root, range(1,2) AS branches
WITH root as root, branches AS l1s, branches AS l2s
UNWIND l1s AS l1
UNWIND l2s AS l2
RETURN root, l1, l1+"_"+l2
这导致:

╒════╤═══╤═════════╕
│root│l1 │l1+"_"+l2│
╞════╪═══╪═════════╡
│0   │1  │1_1      │
├────┼───┼─────────┤
│0   │1  │1_2      │
├────┼───┼─────────┤
│0   │2  │2_1      │
├────┼───┼─────────┤
│0   │2  │2_2      │
└────┴───┴─────────┘
现在我们要做的就是创建节点和关系,同时注意节点/边只创建一次。这可以通过使用来确保。(
MERGE
一开始可能看起来很棘手,但确实有。)

如果要添加其他级别,请按如下方式更新查询:

  • 从分支定义新变量,例如
    l3s
  • 展开新变量,例如到
    l3
  • 为新级别创建附加变量名的附加节点,例如
    MERGE(n3:TreeNode{name:l1+“”+l2+“”+l3})
  • 从上一级别创建新边,例如
    MERGE(n2)-[:X]->(n3)
当然,也可以对节点使用数字。您需要为每个节点生成一个新的数字“id”,而不是附加底涂层

WITH range(1,2) AS branches
WITH branches AS l1s, branches AS l2s
UNWIND l1s AS l1
UNWIND l2s AS l2
MERGE (n0:TreeNode {number: 0})
MERGE (n1:TreeNode {number: l1})
MERGE (n2:TreeNode {number: 2*l1+l2})
MERGE (n0)-[:X]->(n1)
MERGE (n1)-[:X]->(n2)
结果是:


如果事先知道树的高度,可以使用Cypher生成树。为了简单起见,我生成了二叉树(分支因子为2)

这将生成以下树:

说明:对于k个级别的树,我们将
分支
变量复制k-1次,然后展开每个列表。这将创建笛卡尔积,从而生成叶节点。对于k级的(完整)二叉树,这将导致2^(k-1)个叶节点。(这也适用于具有8^(k-1)级的八叉树。)

我们将级别的编号与下划线结合起来,为每个级别创建唯一的变量名。可以按如下方式查询ID:

WITH 0 as root, range(1,2) AS branches
WITH root as root, branches AS l1s, branches AS l2s
UNWIND l1s AS l1
UNWIND l2s AS l2
RETURN root, l1, l1+"_"+l2
这导致:

╒════╤═══╤═════════╕
│root│l1 │l1+"_"+l2│
╞════╪═══╪═════════╡
│0   │1  │1_1      │
├────┼───┼─────────┤
│0   │1  │1_2      │
├────┼───┼─────────┤
│0   │2  │2_1      │
├────┼───┼─────────┤
│0   │2  │2_2      │
└────┴───┴─────────┘
现在我们要做的就是创建节点和关系,同时注意节点/边只创建一次。这可以通过使用来确保。(
MERGE
一开始可能看起来很棘手,但确实有。)

如果要添加其他级别,请按如下方式更新查询:

  • 从分支定义新变量,例如
    l3s
  • 展开新变量,例如到
    l3
  • 为新级别创建附加变量名的附加节点,例如
    MERGE(n3:TreeNode{name:l1+“”+l2+“”+l3})
  • 从上一级别创建新边,例如
    MERGE(n2)-[:X]->(n3)
当然,也可以对节点使用数字。您需要为每个节点生成一个新的数字“id”,而不是附加底涂层

WITH range(1,2) AS branches
WITH branches AS l1s, branches AS l2s
UNWIND l1s AS l1
UNWIND l2s AS l2
MERGE (n0:TreeNode {number: 0})
MERGE (n1:TreeNode {number: l1})
MERGE (n2:TreeNode {number: 2*l1+l2})
MERGE (n0)-[:X]->(n1)
MERGE (n1)-[:X]->(n2)
结果是:


您可以通过创建根目录在Cypher中执行此操作:

CREATE (root:Root:Leaf);
然后根据需要多次重复查询添加级别(但在某些情况下,事务会变得太大):


您可以通过创建根目录在Cypher中执行此操作:

CREATE (root:Root:Leaf);
然后根据需要多次重复查询添加级别(但在某些情况下,事务会变得太大):