자기 타입을 다시 link 하려면, detached를 사용해야 한다
module default {
type Station {
property name -> str;
property line_number -> int64;
multi link connected -> Station;
}
}
{
default::Station {name: '사당', line_number: 2, connected: {}},
default::Station {name: '사당', line_number: 4, connected: {}},
default::Station {name: '낙성대', line_number: 4, connected: {}},
}
-
위와 같은 상황에서 아래의 코드를 실행 시킨다면, select filter된 내용 중에서 동작하게 됨
update Station filter .name = "사당" set {connected += (select Station filter .line_number = 4)}; { default::Station {name: '사당', line_number: 2, connected: {}}, default::Station {name: '사당', line_number: 4, connected: {default::Station {name: '사당', line_number: 4}}}, default::Station {name: '낙성대', line_number: 4, connected: {}}, }
- 다만
connected += (select filter)
에서 필터된 내용에만 적용되는 것은 좀 이상하다
- 다만
-
여튼 detached를 사용해야 한다
update Station filter .name = "사당" set {connected += (select detached Station filter .line_number = 4)}; { default::Station {name: '사당', line_number: 2, connected: {default::Station {name: '사당', line_number: 4}, default::Station {name: '낙성대', line_number: 4}}}, default::Station {name: '사당', line_number: 4, connected: {default::Station {name: '사당', line_number: 4}}}, default::Station {name: '낙성대', line_number: 4, connected: {}}, }
- 이경우 update filter와 select filter가 다른 것으로 인식되어서, 기대한 대로 동작하게 됨
-
왜 그럴까?
- https://github.com/edgedb/easy-edgedb/blob/master/chapter4/answers.md#1-this-insert-is-not-working
- https://www.edgedb.com/docs/reference/edgeql/with#keyword::detached
- INSERT 혹은 UPDATE, SELECT를 할 때, filter를 사용할 경우, 해당 집합에 대해서만 연산을 진행하는 것 같다.
- js의 스코프와 비슷한 느낌이라고 봐도 되지 않을까?