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 |