翻译自:这里
在之前的教程中,我们学习了Dgraph中的数据类型、索引、过滤和反向遍历。
在本教程中,我们将学习如何使用多语言字符串以及使用语言标记对它们进行操作。
字符串和语言
Dgraph中的字符串值为UTF-8格式。Dgraph还支持多种语言中的字符串谓词类型的值。多语言功能对于构建特性特别有用,这要求您以多种语言存储相同的信息。
让我们更多地了解它们吧!
让我们从构建一个简单的食品评论图开始。这是Graph模型。
上面的图表有三个实体:食物Food、评论Comment和国家Country。
图中的节点表示这些实体。
在本教程的其余部分中,我们将表示食物项的节点称为食物节点。表示评论意见的节点为评论节点,表示原产国的节点为国家节点。
下面是它们之间的关系:
- 每一种食物都通过评论边review与它的评论联系在一起。
- 每一种食物都是通过原产地边origin与原产国联系在一起的。
让我们为一些美味的菜肴加一些评论吧!
在那之前先加点香料怎么样?
让我们用这些菜肴的原产国的母语为它们添加评论。
{
"set": [
{
"food_name": "Hamburger",
"review": [
{
"comment": "Tastes very good"
}
],
"origin": [
{
"country": "United states of America"
}
]
},
{
"food_name": "Carrillada",
"review": [
{
"comment": "Sabe muy sabroso"
}
],
"origin": [
{
"country": "Spain"
}
]
},
{
"food_name": "Pav Bhaji",
"review": [
{
"comment": "स्वाद बहुत अच्छा है"
}
],
"origin": [
{
"country": "India"
}
]
},
{
"food_name": "Borscht",
"review": [
{
"comment": "очень вкусно"
}
],
"origin": [
{
"country": "Russia"
}
]
},
{
"food_name": "mapo tofu",
"review": [
{
"comment": "真好吃"
}
],
"origin": [
{
"country": "China"
}
]
}
]
}
这是我们的图!
我们的图:
- 五个蓝色食物节点。
- 绿色节点代表这些食品的原产国。
- 对食品的评论用粉红色标出。
您还可以看到Dgraph自动检测了谓词的数据类型。您可以从模式选项卡Schema看到它。
让我们编写一个查询来获取所有的食物、它们的评论以及它们的原产国。
转到查询选项卡,粘贴查询,然后单击Run。
{
food_review(func: has(food_name)) {
food_name
review {
comment
}
origin {
country
}
}
}
现在,我们只去取食物和他们的评论,
{
food_review(func: has(food_name)) {
food_name
review {
comment
}
}
}
正如所料,这些注释是用不同的语言编写的。
但我们能根据他们的语言获取评论吗?我们可以写一个查询,说:嘿Dgraph,你能给我只写中文的评论吗?
这是可能的,但前提是提供关于字符串数据语言的额外信息。您可以通过使用语言标记来做到这一点。在使用突变添加字符串数据时,您可以使用语言标记来指定字符串谓词的语言。
让我们看看语言标签的作用!
我听说寿司很好吃!让我们用一种以上的语言为Sushi添加评论。我们将用三种不同的语言写评论:英语、日语和俄语。
这是一种突变。
{
"set": [
{
"food_name": "Sushi",
"review": [
{
"comment": "Tastes very good",
"comment@jp": "とても美味しい",
"comment@ru": "очень вкусно"
}
],
"origin": [
{
"country": "Japan"
}
]
}
]
}
让我们仔细看看如何在不同的语言中为注释谓词赋值。
我们使用语言标记(@ru, @jp)作为注释谓词的后缀。
在上述突变中:
- 我们使用@ru语言标签添加俄文评论:"comment@ru": "очень вкусно"。
- 我们使用了@jp语言标签添加评论在日本:"comment@jp": "とても美味しい"。
- 英文评论没有标记:"comment": "Tastes very good"。
在上面的突变中,Dgraph为评论创建了一个新节点,并将注释comment@ru和comment@jp存储在同一节点内的不同谓词中。
让我们运行上面的突变。
转到突变选项卡,粘贴突变,然后单击Run。
我们有一个错误!使用language标记需要将@lang指令添加到模式中。
按照下面的说明将@lang指令添加到注释谓词。
- 转到Schema选项卡。
- 单击注释谓词Comment。
- 在lang指令上打勾。
- 点击更新按钮。
让我们重新运行突变。
成功~
再次提醒,使用上述突变,我们只为Sushi添加了一个评论,而不是三个不同的评论!
但是,如果你想添加三种不同的评论,你可以这样做。
以下面的格式添加注释将创建三个节点,每个节点对应一个注释。但是,只有在添加新的评论时才这样做,而不是用不同的语言表示相同的评论。
"review": [
{
"comment": "Tastes very good"
},
{
"comment@jp": "とても美味しい"
},
{
"comment@ru": "очень вкусно"
}
]
Dgraph允许使用任何字符串作为语言标记。但是,强烈建议只对语言标记使用ISO标准代码。通过遵循标准,您就不需要将标签传达给您的团队或在某个地方记录它。点击这里查看语言标签的ISO标准代码列表。
在下一节中,让我们在查询中使用语言标记。
使用语言标签查询
让我们获得仅针对Sushi的评论。
在之前的文章中,我们学习了如何使用eq操作符和哈希索引hash来查询字符串谓词值。
使用这些知识,让我们首先为food_name谓词添加哈希索引hash。
现在,转到查询选项卡,将查询粘贴到文本区域中,然后单击Run。
{
food_review(func: eq(food_name,"Sushi")) {
food_name
review {
comment
}
}
}
默认情况下,查询只返回未标记的注释。
但是,您可以使用language标记专门查询给定语言中的评论注释。
让我们查询一下Sushi的日语评论。
{
food_review(func: eq(food_name,"Sushi")) {
food_name
review {
comment@jp
}
}
}
现在,让我们查询一下Sushi在俄语中的评论。
{
food_review(func: eq(food_name,"Sushi")) {
food_name
review {
comment@ru
}
}
}
您还可以获取寿司的所有评论, 任何语言的。
{
food_review(func: eq(food_name,"Sushi")) {
food_name
review {
comment@*
}
}
}
下面是查询时使用语言标记的各种方法的语法表。
语法 | 结果 |
---|---|
comment | 查找未标记字符串;如果不存在未标记的评论,则不返回任何内容。 |
comment@. | 查找未标记的字符串,如果没有找到,则返回任何一个语言的内容。但是,这只返回一个值。 |
comment@jp | 寻找标记为@jp的评论。如果没有找到,该查询将不返回任何内容。 |
comment@ru | 寻找标记为@ru的评论。如果没有找到,该查询将不返回任何内容。 |
comment@jp:. | 首先寻找标记为@jp的评论。如果没有找到,那么找到未标记的注释。如果没有找到,则返回任何一个语言的内容。 |
comment@jp:ru | 寻找标记为@jp的评论,然后是@ru。如果两者都没有找到,则不返回任何内容。 |
comment@jp:ru:. | 寻找标记为@jp的评论,然后是@ru。如果两者都没有找到,那么找到未标记的注释。如果没有找到,则返回任何一个语言的内容。 |
comment@* | 返回所有语言标记,包括未标记的。 |
如果你还记得,我们一开始加了一道俄罗斯菜(Borscht)。
如果你注意到的话,我们并没有在俄文的评论中使用语言标签@ru。
因此,如果我们查询所有用俄语写的评论,对Borscht的评论不会出现在列表中。
只有Sushi用俄语写的评论出现在名单上。
如果要用不同的语言表示相同的信息,不要忘记添加语言标签!