4.8 KiB
4.8 KiB
Memgraph 데이터 모델 설계
1. 프로젝트 목표
본 프로젝트의 최종 목표는 Job 실행 순서를 최적화하여 전체 공정의 **소요 시간(Duration)**과 **비용(Cost)**을 최소화하는 최적의 **시나리오(Scenario)**를 찾는 것입니다. 이를 위해 Memgraph 데이터베이스에 공정 데이터를 모델링하고, 다양한 분석 쿼리를 실행할 수 있는 기반을 마련합니다.
2. 데이터 모델 (Graph Schema)
2.1. 노드 (Nodes)
| 노드 레이블 | 설명 | 주요 속성 (Properties) |
|---|---|---|
Job |
실행되어야 할 개별 작업 단위. JobType의 인스턴스. |
id, name, description,
duration, cost |
JobType |
Job의 유형을 정의하는 템플릿. (예: ‘용접’, ‘조립’,
‘검사’) |
type_id, name |
Object |
Job 수행에 사용되거나 Job의 결과로 나오는
객체. ObjectType의 인스턴스. |
id, name, unit_price,
quantity |
ObjectType |
Object의 유형을 정의하는 템플릿. (예: ‘부품A’,
‘반제품B’) |
type_id, name |
Activity |
Job과 Object 간의 n:m 관계를 연결하는 중간
노드. |
id, name, description |
Status |
Job, Object, Activity의 현재
상태. (예: ‘대기’, ‘진행중’, ‘완료’) |
status_id, name |
Scenario |
특정 순서로 배열된 Job들의 집합. 다른
Scenario로부터 파생될 수 있음. |
id, name, description,
total_duration, total_cost |
2.2. 관계 (Relationships)
| 관계 타입 | 시작 노드 | 끝 노드 | 설명 |
|---|---|---|---|
IS_A |
Job |
JobType |
Job이 어떤 JobType에 속하는지 정의
(상속) |
IS_A |
Object |
ObjectType |
Object가 어떤 ObjectType에 속하는지 정의
(상속) |
PRECEDES |
Job (선행) |
Job (후행) |
Job 실행의 선후 관계 정의 (A -[:PRECEDES]-> B: A가
B보다 먼저) |
INCLUDES |
Scenario |
Job |
Scenario에 어떤 Job들이 포함되는지
정의 |
PERFORMS |
Job |
Activity |
Job이 어떤 Activity를 수행하는지 연결 |
ACTS_ON |
Activity |
Object |
Activity가 어떤 Object에 영향을 주는지
연결 |
HAS_STATUS |
Job, Object, Activity |
Status |
각 노드의 현재 상태를 나타냄 |
DELTA_FROM |
Scenario (파생) |
Scenario (기반) |
Scenario가 어떤 기반 Scenario로부터의
증분으로 정의되는지 표시 |
3. 스키마 다이어그램 (Mermaid)
graph TD
subgraph "Core Entities"
J1(Job 1)
J2(Job 2)
A1(Activity)
O1(Object)
end
subgraph "Types & Status"
JT(JobType)
OT(ObjectType)
ST(Status)
end
subgraph "Scenario"
S1(Scenario Base)
S2(Scenario Delta)
end
J1 -- IS_A --> JT
J1 -- PRECEDES --> J2
O1 -- IS_A --> OT
J1 -- PERFORMS --> A1
A1 -- ACTS_ON --> O1
J1 -- HAS_STATUS --> ST
O1 -- HAS_STATUS --> ST
A1 -- HAS_STATUS --> ST
S2 -- INCLUDES --> J1
S2 -- INCLUDES --> J2
S2 -- DELTA_FROM --> S1
4. 주요 Cypher 쿼리 예시
특정 Job의 모든 선행 Job 찾기:
MATCH (j:Job {id: 'target_job_id'})<-[:PRECEDES*]-(predecessor) RETURN predecessor;특정 시나리오의 총 예상 소요 시간 및 비용 계산:
MATCH (s:Scenario {id: 'scenario_id'})-[:INCLUDES]->(j:Job) RETURN s.name, sum(j.duration) AS total_duration, sum(j.cost) AS total_cost;Critical Path 찾기 (가장 오래 걸리는 Job 경로):
MATCH path = (start:Job)-[:PRECEDES*]->(end:Job) WHERE NOT EXISTS ((start)<-[:PRECEDES]-()) AND NOT EXISTS ((end)-[:PRECEDES]->()) WITH nodes(path) AS jobs_in_path UNWIND jobs_in_path AS job WITH path, sum(job.duration) AS path_duration RETURN path, path_duration ORDER BY path_duration DESC LIMIT 1;