Grakn.ai属性实例是否应为单例?嵌套属性重复实例问题咨询
解答:Grakn中带嵌套属性的属性实例重复创建的问题
嘿,这个情况确实是Grakn的预期行为,我来给你理清楚背后的逻辑:
1. 基础属性与复合属性的实例判定规则不一样
Grakn判断要不要复用已有的属性实例,核心看这个属性的「完整标识」是否唯一:
- 像
modelName这种自身不带其他属性的基础属性,唯一标识就是它的数值(比如"Cat Phone"),所以不管你插入多少次,只要值一样,就只会创建一个实例,所有关联的实体共享它。 - 但对于
mass这种自身还带有其他属性(比如unit)的复合属性,Grakn不会自动把「数值+嵌套属性」当成唯一标识来复用实例。因为你每次执行insert $y 10 isa mass, has unit "kg";的时候,都是在明确告诉Grakn“创建一个新的mass实例,然后给它绑定unit "kg"”——它不会主动去检查有没有一模一样的实例存在,而是直接新建。
2. 怎么让复合属性实例成为单例
如果你希望值为10且带unit "kg"的mass只存在一个实例,得换个写法,用match-insert先查再插:
match optional $y isa mass, value 10, has unit "kg"; insert $x isa cellphone, has modelName "Cat Phone", has mass $y; $y isa mass, value 10, has unit "kg";
这个语句的逻辑是:先尝试匹配有没有符合条件的mass实例,有的话直接把它关联给新的cellphone;如果没有,才会创建这个mass实例再关联。这样不管你执行多少次,这个mass实例都只会有一个。
3. 为什么要这么设计?
Grakn这么做是考虑到复合属性的场景可能更复杂:比如同一个数值的mass可能对应不同单位(10kg和10g肯定是不同的属性),甚至有时候同一个数值+单位的属性,也可能需要在不同上下文里区分(虽然这种场景不多)。所以它把实例复用的控制权交给开发者,而不是默认自动复用。
内容的提问来源于stack exchange,提问作者bfour




