반응형
Recent Posts
Recent Comments
관리 메뉴

개발잡부

neo4j 테스트 본문

카테고리 없음

neo4j 테스트

닉의네임 2025. 12. 19. 10:17
반응형

 그래프 기본 구조

  • Node (정점) → 객체, 엔티티
    예: (:User), (:Keyword), (:Item)
  • Relationship (간선) → 관계, 방향 있음
    예: (:Keyword)-[:NEXT]->(:Keyword)
  • Property (속성)
    예: (:Keyword { name:'치킨', count:10 })

 

테스트 

CREATE
      (k1:Keyword {name: "치킨"})-
      [:NEXT]->(k2:Keyword {name: "닭고기"})-
      [:NEXT]->(k3:Keyword {name: "조리식품"})-
      [:NEXT]->(k4:Keyword {name: "튀김"})-
      [:NEXT]->(k5:Keyword {name: "냉동식품"});

 

데이터 조회

MATCH (n) RETURN n LIMIT 10;

 

 

특정노드 조회

MATCH (k:Keyword {name:'치킨'})
RETURN k;

 

노드생성

CREATE (:Keyword {name:'치킨', count:1});

 

관계생성 

MATCH (a:Keyword {name:'치킨'}), (b:Keyword {name:'닭고기'})
MERGE (a)-[r:NEXT]->(b)
ON CREATE SET r.count = 1
ON MATCH SET r.count = r.count + 1
RETURN r;

 

 

 

자 이제 부터 진짜 테스트 

 

하나씩 처리 하는 방법 

// 하나씩 처리 하는 방법
- 투자전략
CREATE
  (k1:Keyword {name: "스마트폰"})-
  [:NEXT]->(k2:Keyword {name: "전기차"})-
  [:NEXT]->(k3:Keyword {name: "AI"})-
  [:NEXT]->(k4:Keyword {name: "양자"})-
  [:NEXT]->(k5:Keyword {name: "로봇"})-
  [:NEXT]->(k6:Keyword {name: "우주"});

- 관계생성
MERGE (:Keyword {name: '애플'});  // 노드만 먼저 만들고

MATCH (a:Keyword {name:'스마트폰'}), (b:Keyword {name:'애플'})
MERGE (a)-[r:RELATED]->(b)
ON CREATE SET r.count = 1
ON MATCH SET r.count = r.count + 1
RETURN r;

MERGE (:Keyword {name: '테슬라'});

MATCH (a:Keyword {name:'전기차'}), (b:Keyword {name:'테슬라'})
MERGE (a)-[r:RELATED]->(b)
ON CREATE SET r.count = 1
ON MATCH SET r.count = r.count + 1
RETURN r;

MERGE (:Keyword {name: '엔비디아'});
MATCH (a:Keyword {name:'AI'}), (b:Keyword {name:'엔비디아'})
MERGE (a)-[r:RELATED]->(b)
ON CREATE SET r.count = 1
ON MATCH SET r.count = r.count + 1
RETURN r;

 

 

 

 

create 를 두번 하면 

그러니까 merge 로 노드를 만들었는데 next 를 맺어주기 위해 create 를 했더니 
같은 이름의 노드가 2개가 생기면서 이런.. 기형적인.. 모습이...

 

이런 경우엔 create 하지말고  match + merge 로 기존 노드들 사이에 next 추가 

 

시나리오

투자흐름은 스마트폰 - 전기차 - AI - 양자 - 로봇 - 우주 의 흐름으로 검색 유입되었고

스마트폰 - 애플 관계에서  애플이 전기차 사업에 뛰어들어서 전기차 - 애플 의 관계가 추가되었다. 

테슬라는 전기차에서 AI, 우주, 로봇 사업을 하고 있어 관계가 있고

엔비디아는 AI 에서 양자부문까지 진출 관계를 형성하였다. 

 

테스트

- 삭제
MATCH (n) DETACH DELETE n;

- 데이터 조회
MATCH (n) RETURN n LIMIT 100;



//여러개 한번에 처리
// 1) 우선 필요한 노드들 전부 만들고
UNWIND ['스마트폰'
, '전기차'
, 'AI'
, '애플'
, '엔비디아'
, '테슬라'
, '양자'
, '아이온큐'
, '로봇'
, '리치테크로보틱스'
, '우주'
, '로캣랩'
, '리게티'
 ] AS name
MERGE (:Keyword {name:name});

//2) 관계를 맺음
UNWIND [
  ['스마트폰', '애플'],
  ['전기차', '테슬라'],
  ['양자', '아이온큐'],
  ['로봇', '리치테크로보틱스'],
  ['우주', '로캣랩'],
  ['양자', '리게티'],
  ['AI', '엔비디아'],
  ['양자', '엔비디아'],
  ['AI', '테슬라'],
  ['로봇', '테슬라'],
  ['테슬라', '로봇'],
  ['전기차', '애플']
] AS pair

MATCH (a:Keyword {name: pair[0]}),
      (b:Keyword {name: pair[1]})
MERGE (a)-[r:RELATED]->(b)
ON CREATE SET r.count = 1
ON MATCH SET r.count = r.count + 1
RETURN a.name, b.name, r.count;

3) NEXT
UNWIND ["스마트폰", "전기차", "AI", "양자", "로봇", "우주"] AS name
WITH collect(name) AS names  // ["스마트폰","전기차",...,"우주"]

UNWIND range(0, size(names)-2) AS i
WITH names[i]   AS fromName,
     names[i+1] AS toName

MATCH (from:Keyword {name: fromName}),
      (to:Keyword   {name: toName})
MERGE (from)-[:NEXT]->(to);



// 하나씩 처리 하는 방법
- 투자전략
CREATE
  (k1:Keyword {name: "스마트폰"})-
  [:NEXT]->(k2:Keyword {name: "전기차"})-
  [:NEXT]->(k3:Keyword {name: "AI"})-
  [:NEXT]->(k4:Keyword {name: "양자"})-
  [:NEXT]->(k5:Keyword {name: "로봇"})-
  [:NEXT]->(k6:Keyword {name: "우주"});

- 관계생성
MERGE (:Keyword {name: '애플'});  // 노드만 먼저 만들고

MATCH (a:Keyword {name:'스마트폰'}), (b:Keyword {name:'애플'})
MERGE (a)-[r:RELATED]->(b)
ON CREATE SET r.count = 1
ON MATCH SET r.count = r.count + 1
RETURN r;

MERGE (:Keyword {name: '테슬라'});

MATCH (a:Keyword {name:'전기차'}), (b:Keyword {name:'테슬라'})
MERGE (a)-[r:RELATED]->(b)
ON CREATE SET r.count = 1
ON MATCH SET r.count = r.count + 1
RETURN r;

MERGE (:Keyword {name: '엔비디아'});
MATCH (a:Keyword {name:'AI'}), (b:Keyword {name:'엔비디아'})
MERGE (a)-[r:RELATED]->(b)
ON CREATE SET r.count = 1
ON MATCH SET r.count = r.count + 1
RETURN r;


조회
MATCH (a:Keyword {name:"스마트폰"})-[r:NEXT*1..5]->(b)
RETURN a, r, b;

특정노드 기준으로
MATCH (a:Keyword {name:'양자'})-[r]->(b)
RETURN a, r, b;



반응형
Comments