STUDY/LLM

[LLM] Neo4jGraph์™€ Cypher ์ฟผ๋ฆฌ

seoyn 2026. 7. 7. 09:28

1. Neo4jGraph

 : Neo4j Python ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ฐ์‹ผ ๋ž˜ํผ(Wrapper) ํด๋ž˜์Šค

์—ญํ• 

 - Cypher ์ฟผ๋ฆฌ ์‹คํ–‰ : ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ฟผ๋ฆฌ ์‹คํ–‰, ๊ฒฐ๊ณผ๋ฅผ list[dict]๋กœ ๋ฐ˜ํ™˜

 - ๊ทธ๋ž˜ํ”„ ์Šคํ‚ค๋งˆ ์ž๋™ ์กฐํšŒ : ๋…ธ๋“œ ๋ ˆ์ด๋ธ”·๊ด€๊ณ„ ํƒ€์ž…·์†์„ฑ ์ •๋ณด ์ž๋™์œผ๋กœ ์ฝ์–ด schema ์†์„ฑ์— ์ €์žฅ

 - GraphRAG ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ๊ณ„ : GraphCypherQAChain, LLMGraphTransformer ๋“ฑ๊ณผ ๊ฒฐํ•ฉํ•ด ์ž์—ฐ์–ด ๊ธฐ๋ฐ˜ ๊ทธ๋ž˜ํ”„ ์งˆ์˜์‘๋‹ต ๊ตฌ์„ฑ

 

๊ฐ์ฒด ์ƒ์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ  - ํ™˜๊ฒฝ๋ณ€์ˆ˜(.env)์— ์—ฐ๊ฒฐ ์ •๋ณด ์ €์žฅํ•ด๋‘๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด ๋ฐ”๋กœ ์ƒ์„ฑ ๊ฐ€๋Šฅ

ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ๊ธฐ๋ณธ๊ฐ’ ์„ค๋ช…
url str | None None Neo4j ์„œ๋ฒ„ URL(ํ™˜๊ฒฝ๋ณ€์ˆ˜ NEO4J_URI ๋Œ€์ฒด ๊ฐ€๋Šฅ)
username str | None None ์ธ์ฆ ์‚ฌ์šฉ์ž๋ช…(NEO4J_USERNAME)
password str | None None ์ธ์ฆ ํŒจ์Šค์›Œ๋“œ(NEO4J_PASSWORD)
database str | None "neo4j" ์ ‘์†ํ•  DB ์ด๋ฆ„
refresh_schema bool True ์ƒ์„ฑ ์‹œ ์ž๋™ ์Šคํ‚ค๋งˆ ์กฐํšŒ ์—ฌ๋ถ€
enhanced_schema bool Fasle True๋ฉด ์†์„ฑ ์‹ค์ œ ์˜ˆ์‹œ๊ฐ’๊นŒ์ง€ ์Šคํ‚ค๋งˆ์— ํฌํ•จ

 

• ์ฃผ์š” ๋ฉ”์†Œ๋“œ

๋ฉ”์†Œ๋“œ ๊ธฐ๋Šฅ
query(query, params={}) Cypher ์‹คํ–‰ → List[Dict] ๋ฐ˜ํ™˜
params๋กœ ํŒŒ๋ผ๋ฏธํ„ฐํ™” ์ฟผ๋ฆฌ(SQL Injection ๋ฐฉ์ง€) ์ง€์›
refresh_schema() DB๋กœ๋ถ€ํ„ฐ ์Šคํ‚ค๋งˆ ์ •๋ณด ์žฌ์กฐํšŒ·๊ฐฑ์‹ 
add_graph_documents(graph_documents) GraphDocument(Node/Relationship ๋ฆฌ์ŠคํŠธ)๋ฅผ DB์— ์ €์žฅ
close() ๋“œ๋ผ์ด๋ฒ„ ์—ฐ๊ฒฐ ์ข…๋ฃŒ(with๋ฌธ ์‚ฌ์šฉ ์‹œ ์ž๋™ ํ˜ธ์ถœ)
GraphDocument ๊ตฌ์กฐ

 - GraphDocument = list[Node] + list[Relationship]

 → Node : id(์‹๋ณ„์ž), type(๋ผ๋ฒจ), properties(์†์„ฑ dict)

 → Relationship : source(์‹œ์ž‘ Node), target(๋ Node), type(๊ด€๊ณ„ ํƒ€์ž…), properties(์†์„ฑ dict)

 

์ฃผ์š” ์†์„ฑ

์†์„ฑ ํƒ€์ž… ์„ค๋ช…
schema str LLM ํ”„๋กฌํ”„ํŠธ์— ๋ฐ”๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด ํ˜•ํƒœ ์Šคํ‚ค๋งˆ
structured_schema dict node_props, rel_props, relationships ํ‚ค ํฌํ•จํ•œ ๊ตฌ์กฐํ™”๋œ ์Šคํ‚ค๋งˆ

 

2. Cypher ๊ธฐ๋ณธ ํ‘œ๊ธฐ๋ฒ•

์š”์†Œ ํ‘œ๊ธฐ
๋…ธ๋“œ ( ), ๋ผ๋ฒจ์€ : ์‹œ์ž‘ - ex. (p: Person)
๊ด€๊ณ„ [ ], ๋ฐฉํ–ฅ ํ•„์ˆ˜(->, <-) - ex. -[r: KNOWS]->
์†์„ฑ { }, ex. (m {name: "Neo4j"})
์ฃผ์„  // (ํ•œ ์ค„), /* */ (์—ฌ๋Ÿฌ ์ค„)

- ๋ฐฉํ–ฅ ์—†๋Š” ๊ด€๊ณ„ : CREATE์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€. ๋…ธ๋“œ·๊ด€๊ณ„์— ๋ณ€์ˆ˜ ํ• ๋‹นํ•ด์•ผ ์ดํ›„ ์ฐธ์กฐ ๊ฐ€๋Šฅ

 

3. CREATE - ๋…ธ๋“œ/๊ด€๊ณ„ ์ƒ์„ฑ

 -โ—๏ธ ๋™์ผ ๋…ธ๋“œ๋ผ๋„ ์ค‘๋ณต ์ƒ์„ฑ๋จ(์ค‘๋ณต ๋ฐฉ์ง€ : contraint or MERGE ์‚ฌ์šฉ)

// ๋…ธ๋“œ ์ƒ์„ฑ
CREATE (๋ณ€์ˆ˜: ๋ผ๋ฒจ {์†์„ฑํ‚ค: ์†์„ฑ๊ฐ’, ...})

// ๊ธฐ์กด ๋…ธ๋“œ ์‚ฌ์ด์— ๊ด€๊ณ„ ์ƒ์„ฑ
MATCH (a), (b) WHERE ์กฐ๊ฑด
CREATE (a) -[:๊ด€๊ณ„ํƒ€์ž… {์†์„ฑ}]-> (b)

// ๋…ธ๋“œ+๊ด€๊ณ„ ๋™์‹œ ์ƒ์„ฑ
CREATE (a: Label1 {...}) -[:REL_TYPE]-> (b: Label2 {...})

 

4. MATCH / RETURN - ์กฐํšŒ

 - ์ฝ๊ธฐ ์ „์šฉ ์ ˆ(โ‰’ SQL์˜ SELECT). RETURN๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ๊ฒฐ๊ณผ ๋…ธ์ถœ

MATCH ํŒจํ„ด
[WHERE ์กฐ๊ฑด]
RETURN ...
[ORDER BY ์ปฌ๋Ÿผ ASC | DESC]

 • labels(n) : ๋…ธ๋“œ์˜ ๋ผ๋ฒจ ์กฐํšŒ

 • type(r) : ๊ด€๊ณ„์˜ ํƒ€์ž… ์กฐํšŒ

 • collect(x) : ์—ฌ๋Ÿฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฌถ์Œ

 • RETURN DISTINCT : ์ค‘๋ณต ์ œ๊ฑฐ

 

4-1. ORDER BY / SKIP / LIMIT

RETURN ...
ORDER BY ์ปฌ๋Ÿผ1 [ASC | DESC], ์ปฌ๋Ÿผ2 [ASC | DESC]
SKIP N  // ์•ž N๊ฐœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ(ํŽ˜์ด์ง•)
LIMIT M  // ์ตœ๋Œ€ M๊ฐœ๋งŒ ๋ฐ˜ํ™˜

 

4-2. OPTIONAL MATCH

 : ๋งค์นญ๋˜์ง€ ์•Š์•„๋„ ํ–‰์„ ์œ ์ง€. ๋ฏธ๋งค์นญ ๋ณ€์ˆ˜๋Š” null(โ‰’ SQL์˜ LEFT OUTER JOIN)

 

5. MERGE - ์กฐํšŒ or ์ƒ์„ฑ

 : "์žˆ์œผ๋ฉด ์ฐพ๊ณ , ์—†์œผ๋ฉด ๋งŒ๋“ ๋‹ค". ๋ช…์‹œํ•œ ๋ชจ๋“  ์†์„ฑ์ด ๋งค์นญ ํ‚ค๋กœ ์‚ฌ์šฉ

- ๋งค์นญ ํ‚ค ์™ธ ์†์„ฑ์€ ON CREATE SET์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „

MERGE (n: Label {key: value})

MATCH (a), (b) WHERE ...
MERGE (a) -[:REL]-> (b)

MERGE (n: Label {id: 1})
ON CREATE SET n.createAt = timestamp(), n.count = 1
ON MATCH SET n.updataAt = timestamp(), n.count = n.count + 1

 

6. SET - ์†์„ฑ/๋ผ๋ฒจ ์ˆ˜์ •

 : ์ด๋ฏธ ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ

SET n.์†์„ฑ = ๊ฐ’  // ๋‹จ์ผ ์†์„ฑ ๋ณ€๊ฒฝ/์ถ”๊ฐ€
SET n.์†์„ฑ1 = v1, n.์†์„ฑ2 = v2
SET n += {key: value, ...}  // ์—ฌ๋Ÿฌ ์†์„ฑ ๋ณ‘ํ•ฉ
SET n = {key: value, ...}  // ์ „์ฒด ๊ต์ฒด(๊ธฐ์กด ์†์„ฑ ์‚ญ์ œ)
SET n: NewLabel  // ๋ผ๋ฒจ ์ถ”๊ฐ€

 

7. DELETE / DETACH DELETE - ์‚ญ์ œ

 • DELETE : ๊ด€๊ณ„ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋Š” ์‚ญ์ œ ๋ถˆ๊ฐ€

 • DETACH DELETE : ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๊ด€๊ณ„ ํ•จ๊ป˜ ์‚ญ์ œ

MATCH (a) -[r:REL]-> (b) DELETE r;  // ๊ด€๊ณ„๋งŒ ์‚ญ์ œ
MATCH (n: Label) DELETE n;  // ๋…ธ๋“œ๋งŒ ์‚ญ์ œ(๊ด€๊ณ„ ์—†์„ ๋•Œ)
MATCH (n: Label) DETACH DELETE n;  // ๋…ธ๋“œ+๊ด€๊ณ„ ์‚ญ์ œ
MATCH (n) DETACH DELETE n;  // ์ „์ฒด ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”

 

8. REMOVE - ์†์„ฑ/๋ผ๋ฒจ ์ œ๊ฑฐ

MATCH (n) REMOVE n.์†์„ฑ๋ช…;  // ์†์„ฑ ์‚ญ์ œ
MATCH (n) REMOVE n:๋ผ๋ฒจ๋ช…;  // ๋ผ๋ฒจ ์‚ญ์ œ

'STUDY > LLM' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[LLM] Graph Schema ์„ค๊ณ„, ๋ฒกํ„ฐ ๊ฒ€์ƒ‰&Text-to-Cypher ์กฐํšŒ  (0) 2026.07.12
[LLM] Neo4jGraph์™€ Cypher ์ฟผ๋ฆฌ - 2  (0) 2026.07.09
[LLM] RAG - evaluation  (0) 2026.07.06
[LLM] Advanced RAG  (0) 2026.07.05
[LLM] RAG - Retriever  (0) 2026.07.04