2016-11-25 16 views

답변

0

사이퍼가 혼자 할 수 있는지 확실하지 않지만 프로그래밍 언어를 사용하고 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, 

는 당신이

1

당신은 사전에 높이를 알고있는 경우 트리를 생성하는 사이퍼를 사용하여 찾고 있던 무엇인지 알려주세요. 간단히하기 위해, 나는 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) 

이 다음 트리 결과 :

enter image description here

설명 : 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) 

결과 :

enter image description here

1

당신은 루트 작성하여 사이퍼에서 작업을 수행 할 수 있습니다

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)}));