通常,图形数据库使用有向边来表示二元关系。在这种情况下,使用动词来描述关系是有意义的,因为动词通常表示主语和宾语之间的定向动作。
Grakn 是一个知识图谱,其工作方式不同。这是因为 Grakn 中的关系充当超边。这意味着关系中可以有两个以上的参与者(称为角色扮演者)。这非常适合灵活建模,但它可能会破坏动词命名约定。
要根据您的示例进行操作,而不是 artist remixed track,我们可以(在这种情况下非常方便)使用名词 remix 作为关系。对域模型进行猜测,艺术家重新混合曲目,结果他们创建了新曲目。这是在 grakn 中建立三元(3 路)关系的绝佳机会。模型如下:
define
remix sub relation,
relates original-track,
relates remixed-track,
relates remixing-artist;
track sub entity,
plays original-track,
plays remixed-track;
artist sub entity,
plays remixing-artist;
一旦在 Grakn 中定义了上述模式,我们就可以像这样添加一个连接两个新轨道和一个新艺术家的混音实例:
insert
$o isa track, has name "Brimful of Asha";
$rt isa track, has name "Brimful of Asha (Norman Cook Remix)";
$a isa artist, has name "Norman Cook";
$r(original-track: $o, remixed-track: $rt, remixing-artist: $a) isa remix;
事实证明,为关系使用名词是有用的,因为它不会以二进制方式连接它可以拥有的 3 个角色扮演者中的任何一个。相反,我们将位于两条轨道和艺术家之间的概念命名为。
通过这种方式,我们看到关系很好地描述了任何一对角色之间的(无向)链接:
original-track <-remix-> remixed-track
original-track <-remix-> remixing-artist
remixed-track <-remix-> remixing-artist
我们可以看到,使用remixed 代替remix 效果并不好,它会尝试在这些没有链接的地方添加方向。
Grakn 的数据模型可以即时扩展。因此,即使您从二元关系开始,如果以后添加更多角色,使其成为三元或 N 元,动词命名将不再有意义。
用名词命名关系并不总是那么容易。
我的建议是:
- 首先尝试将动词(用作形容词)的过去或现在分词与名词一起使用。例如角色
remixing-artist 使用这个。
- 在使用名词时求助于动词真的很尴尬,和/或如果您正在处理您希望始终是二元的关系。