Triple Edge는 (Subject, Property, Object) 형태의 관계/속성을 표현하는 Edge 타입이다.

이중 모드 설계

  • 기본 모드 (4워드): PropCode 0~62 (Top 63 속성)
  • 확장 모드 (5워드): PropCode=63이면 전체 P-ID 커버 (의미정렬 16비트)

기본 모드 (4워드 = 64비트)

1st WORD (16비트)
┌────────────────────┬────────────────────┐
│      Prefix        │     PropCode       │
│      10bit         │       6bit         │
└────────────────────┴────────────────────┘

2nd WORD: Edge TID (16비트)
3rd WORD: Subject TID (16비트)
4th WORD: Object TID (16비트)
필드비트설명
Prefix101100 000 001
PropCode60~62: Top 63 속성, 63: 확장 모드
Edge TID16이 Edge의 TID
Subject TID16주어 Entity/Node TID
Object TID16목적어 Entity/Node/Quantity TID

확장 모드 (5워드 = 80비트)

PropCode가 63이면 3rd 워드에 16비트 P-ID가 추가된다.

1st WORD: [Prefix 10bit] + [PropCode=63 6bit]
2nd WORD: Edge TID (16비트)
3rd WORD: P-ID 의미정렬 (16비트)
4th WORD: Subject TID (16비트)
5th WORD: Object TID (16비트)

Top 63 속성 (PropCode 0~62)

위키데이터 사용 빈도 기반으로 선정된 속성들이다.

분류/타입 (Code 0~7)

CodeP-ID속성명설명
0P31instance of~의 인스턴스
1P279subclass of~의 하위 클래스
2P361part of~의 부분
3P527has part~을 포함
4P1552has quality속성/특성
5P460same as동일
6P1889different from다름
7P156followed by후속

공간/위치 (Code 8~15)

CodeP-ID속성명설명
8P17country국가
9P131located in위치 (행정구역)
10P276location위치 (장소)
11P625coordinate좌표
12P30continent대륙
13P36capital수도
14P150contains포함 (지역)
15P206located next to인접 수역

시간 (Code 16~23)

CodeP-ID속성명설명
16P569date of birth생년월일
17P570date of death사망일
18P571inception설립일
19P576dissolved해산일
20P577publication date발표일
21P580start time시작 시점
22P582end time종료 시점
23P585point in time시점

인물 기본 (Code 24~31)

CodeP-ID속성명설명
24P19place of birth출생지
25P20place of death사망지
26P21sex or gender성별
27P27citizenship국적
28P735given name이름
29P734family name
30P1559name in native language본명
31P742pseudonym필명/예명

관계/소속 (Code 32~39)

CodeP-ID속성명설명
32P22father아버지
33P25mother어머니
34P26spouse배우자
35P40child자녀
36P3373sibling형제자매
37P463member of소속
38P108employer고용주
39P1027conferred by수여 기관

직업/활동 (Code 40~47)

CodeP-ID속성명설명
40P106occupation직업
41P39position held직위
42P69educated at학력
43P101field of work분야
44P1344participant in참가 (이벤트)
45P166award received수상
46P800notable work대표작
47P1412languages spoken사용 언어

미디어/식별 (Code 48~55)

CodeP-ID속성명설명
48P18image이미지
49P154logo로고
50P41flag image국기/기
51P373Commons category위키미디어
52P856official website공식 웹사이트
53P214VIAF IDVIAF
54P227GND IDGND
55P213ISNIISNI

작품/창작 (Code 56~62)

CodeP-ID속성명설명
56P50author저자
57P57director감독
58P86composer작곡가
59P175performer연주자/가수
60P136genre장르
61P364original language원어
62P123publisher출판사

Code 63은 확장 모드 표시자로 예약되어 있다.

PropCode 요약

┌─────────────────────────────────────────────┐
│  0~7:   분류/타입 (P31, P279, ...)          │
│  8~15:  공간/위치 (P17, P131, ...)          │
│  16~23: 시간 (P569, P570, ...)              │
│  24~31: 인물 기본 (P19, P20, ...)           │
│  32~39: 관계/소속 (P22, P25, ...)           │
│  40~47: 직업/활동 (P106, P39, ...)          │
│  48~55: 미디어/식별 (P18, P856, ...)        │
│  56~62: 작품/창작 (P50, P57, ...)           │
├─────────────────────────────────────────────┤
│  63: 확장 모드 표시자                        │
└─────────────────────────────────────────────┘

예시

기본 모드: “Apple은 회사이다”

P31 (instance of) → PropCode = 0

Triple Edge:
  1st: [1100 000 001] + [000000]  - Prefix + PropCode 0
  2nd: [TID: 0x0101]              - Edge TID
  3rd: [TID: 0x0010]              - Apple (Subject)
  4th: [TID: 0x0020]              - 회사 (Object)

총: 4워드

확장 모드: “에펠탑의 높이는 330m”

P2048 (height) → Top 63 외 → 확장 모드

Triple Edge:
  1st: [1100 000 001] + [111111]  - Prefix + Ext(63)
  2nd: [TID: 0x0102]              - Edge TID
  3rd: [0xA800]                   - P2048 의미정렬
  4th: [TID: 0x0030]              - 에펠탑 (Subject)
  5th: [TID: 0x0050]              - 330m Quantity (Object)

총: 5워드

파싱

def parse_triple_edge(data: bytes) -> dict:
    word1 = int.from_bytes(data[0:2], 'big')

    prefix = word1 >> 6
    assert prefix == 0b1100000001, "Not Triple Edge"

    prop_code = word1 & 0x3F

    if prop_code < 63:
        # 기본 모드 (4워드)
        return {
            'mode': 'basic',
            'prop_code': prop_code,
            'edge_tid': int.from_bytes(data[2:4], 'big'),
            'subject_tid': int.from_bytes(data[4:6], 'big'),
            'object_tid': int.from_bytes(data[6:8], 'big'),
            'words': 4
        }
    else:
        # 확장 모드 (5워드)
        return {
            'mode': 'extended',
            'p_id': int.from_bytes(data[4:6], 'big'),
            'edge_tid': int.from_bytes(data[2:4], 'big'),
            'subject_tid': int.from_bytes(data[6:8], 'big'),
            'object_tid': int.from_bytes(data[8:10], 'big'),
            'words': 5
        }