使用Cypher在Neo4j中创建简单的八叉树结构
我想使用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来创建节点和关系。
例如,在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)
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)
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);
然后根据需要多次重复查询添加级别(但在某些情况下,事务会变得太大):