我正在创建一个特定于域的模型,其中包括具有属性的实体,这些属性的原始来源或引文需要定义。
例如在graql中:
define
"country" sub entity
has population;
"evidence" sub attribute datatype string;
"population" sub attribute datatype string
has evidence;
这似乎定义了属性的属性,并且从概念上讲似乎使属性的含义取决于特定的上下文,可以说,将其更好地建模为带有其他实体关系的带注释的“事实”实体。
在不增加模型复杂性的情况下,对此类属性建模的最简单方法是什么?
答案 0 :(得分:3)
属性的属性 属性的属性不一定像您期望的那样起作用。重要的是要记住,在Grakn中,对于具有特定值的特定类型的属性,图形中将只有一个节点。
也就是说,类型population
值sixty million
的属性在知识图中只会出现一次。
如果我们稍稍更改您的架构以添加国家/地区名称(也不需要在类型周围使用单引号):
define
country sub entity
has population,
has name;
name sub attribute datatype string;
evidence sub attribute datatype string;
population sub attribute datatype string
has evidence;
然后将两个国家/地区添加到知识图中:
insert $uk isa country, has name 'UK', has population $p; $p 'sixty million' has evidence 'journal';
insert $fr isa country, has name 'France', has population $p; $p 'sixty million' has evidence 'wikipedia';
commit;
如果将其形象化,我们可以看到的是我们无法单独区分每个国家的人口来源,因为这两个国家和这两个证据都与同一个人口实例有关。
(在Grakn Workbase Visualiser中显示)
在以下情况下,属性的属性才有意义:
具有属性phrase
值Hi there!
的属性language
值English
。也就是说,language
属性是指短语属性的 value 。
这意味着,如果您想记录属性的来源,则需要做不同的事情。我建议三个可能的选择。请注意,出于上述原因,对于以下三个想法,population
都不应该拥有evidence
。在以上population sub attribute datatype string has evidence;
的模式中,应该变成population sub attribute datatype string;
1。内隐关系
内幕之下,Grakn具有隐式关系来实现属性所有权,该属性总是自动生成并以@has-
为前缀,例如@has-population
。我们可以将属性附加到这些隐式关系上!
首先删除我们在上面插入的实例(请注意,将删除图中的所有实体和属性!)
match $x isa entity; $y isa attribute; delete $x, $y;
然后定义隐式population
属性可以拥有evidence
并添加示例:
define @has-population has evidence;
insert $uk isa country, has name 'UK', has population $p via $r; $p 'sixty million'; $r has evidence 'journal';
insert $fr isa country, has name 'France', has population $p via $r; $p 'sixty million'; $r has evidence 'wikipedia';
现在,我们可以将英国人口的证据与法国人口的证据区分开。我们可以查询以下内容:
match $c isa country, has name $n, has population $p via $r;
$p 'sixty million'; $r has evidence $e; get $n, $e;
结果:
{$n val "France" isa name; $e val "wikipedia" isa evidence;}
{$n val "UK" isa name; $e val "journal" isa evidence;}
2。关系到隐式关系
如果证据比单个属性更复杂,则可以将其更好地建模为一种关系,其中@has-population
起着作用。
define
information-sourcing sub relationship,
relates sourced-information,
relates information-source;
@has-population plays sourced-information;
publication sub entity,
plays information-source;
insert $uk isa country, has name 'UK', has population $p via $r; $p 'sixty million'; $pub isa publication; $i(sourced-information: $r, information-source: $pub) isa information-sourcing;
insert $uk isa country, has name 'France', has population $p via $r; $p 'sixty million'; $pub isa publication; $i(sourced-information: $r, information-source: $pub) isa information-sourcing;
3。正常关系
最后,您可以创建一个链接population
,country
和evidence
的关系,如果它们看起来太复杂,则避免使用隐式关系。
结论
使用哪种方法取决于您要建模的域。为了回答您的问题,第一种方法向架构中添加了最少的其他元素。