Cypher를 사용하여 Neo4j에서 octree 구조를 만들고 싶습니다. 각 노드와 "수동"관계를 만들 필요없이이 구현 될 수있는 방법에 대한Cypher를 사용하여 Neo4j에서 간단한 octree 구조 만들기
어떤 아이디어 : 나는 아래 그림과 비슷한 무언가를 만드시겠습니까?
Cypher를 사용하여 Neo4j에서 octree 구조를 만들고 싶습니다. 각 노드와 "수동"관계를 만들 필요없이이 구현 될 수있는 방법에 대한Cypher를 사용하여 Neo4j에서 간단한 octree 구조 만들기
어떤 아이디어 : 나는 아래 그림과 비슷한 무언가를 만드시겠습니까?
사이퍼가 혼자 할 수 있는지 확실하지 않지만 프로그래밍 언어를 사용하고 neo4j에 연결하여 노드와 관계를 만들 수 있습니다. 예를 들어, PHP에서
: 사이퍼 문은 당신이 당신의 neo4j 인스턴스에 연결하고 그 문을 실행할 필요가 있습니다 물론
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);
. 당신이 바로 사이퍼 문을 인쇄 한 다음 신 쉘 또는 여기에 브라우저
에 붙여 넣을 수 있음을 수행하는 방법을 잘 모르는 경우
는 출력이 8 명 다음에 부모를 보여줍니다 create_tree(0,2)
를 실행의 출력
0: 00,01,02,03,04,05,06,07,
00: 00,01,02,03,04,05,06,07,
01: 10,11,12,13,14,15,16,17,
02: 20,21,22,23,24,25,26,27,
03: 30,31,32,33,34,35,36,37,
04: 40,41,42,43,44,45,46,47,
05: 50,51,52,53,54,55,56,57,
06: 60,61,62,63,64,65,66,67,
07: 70,71,72,73,74,75,76,77,
는 당신이
당신은 사전에 높이를 알고있는 경우 트리를 생성하는 사이퍼를 사용하여 찾고 있던 무엇인지 알려주세요. 간단히하기 위해, 나는 2의 분기점을 가진 2 진 트리를 생성했다.
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
MERGE (n0:TreeNode {name: root})
MERGE (n1:TreeNode {name: l1})
MERGE (n2:TreeNode {name: l1+"_"+l2})
MERGE (n0)-[:X]->(n1)
MERGE (n1)-[:X]->(n2)
이 다음 트리 결과 :
설명 : K 수준의 나무를 위해, 우리는 branches
변수는 시간-1 K, 각 목록을 긴장을 풀고 복사합니다. 이것은 데카르트 곱을 생성하여 잎 노드를 생성합니다. k 레벨의 (전체) 2 진 트리의 경우 2^(k-1) 개의 리프 노드가됩니다. (이것은 또한 8^(k-1) 레벨을 갖는 octree에서도 작동합니다.)
우리는 레벨 수를 밑줄로 결합하여 각 레벨에 고유 한 변수 이름을 만듭니다. 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
을 사용하여 보장됩니다. (MERGE
처음에는 까다로운 보이지만, good explanations가 있습니다.)
당신이 추가 레벨을 추가 같은 쿼리를 업데이트하려면 :
l3s
l3
MERGE (n3:TreeNode {name: l1+"_"+l2+"_"+l3})
MERGE (n2)-[:X]->(n3)
물론 노드에 숫자를 사용할 수도 있습니다. undercores를 추가하는 대신 각 노드에 대해 새로운 숫자 "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)
결과 :
당신은 루트 작성하여 사이퍼에서 작업을 수행 할 수 있습니다
CREATE (root:Root:Leaf);
다음 필요한만큼 여러 번 수준을 추가 쿼리를 반복을 (어떤 시점에서 거래가 너무 커질 것입니다.) :
MATCH (n:Leaf)
REMOVE n:Leaf
FOREACH (i IN range(0, 7) |
CREATE (n)-[:CONTAINS]->(:Node:Leaf {value: coalesce(n.value, "") + toString(i)}));