dgraph的使用总结--------dgraph简单使用3

承承接上文      顺序观看,效果更佳

dgrph官网,英语好,请直接食用

目录

一、字符串索引和推特图建模

1、在Dgraph中建模推文

2、字符串索引和查询

1、哈希索引 hash

2、精确索引 exact

3、术语索引 Term 

4、hash、exact、term对应函数

二、高级文本搜索

1、全文搜索  Full text search

2、正则表达式搜索  regexp


一、字符串索引和推特图建模

1、在Dgraph中建模推文

关系

我们有三种类型的节点:User、Tweet和Hashtag。

让我们来看看这些节点如何相互关联,并将它们的关系建模为它们之间的边缘。

UserTweet节点

TweetUser节点之间存在双向关系。

每一条推文都是由一个用户创作的,用户可以创作许多推文。

让我们将表示此关系的边命名为authored 

authored 从用户节点指向推特节点。

一条推文可以提到许多用户,并且用户可以在许多推文中被提及。

让我们命名mentioned代表上述关系的边。

mentioned Tweet节点指向User节点。这些用户就是推文中提到的用户。

tweet hashtag 

一条推文可以有一个或多个标签。让我们为边命名,它将这种关系表示为tagged_with

带有边缘的tagged_with Tweet节点指向Hashtag节点。这些标签节点对应于推文中的标签。

Authorhashtag节点

作者和哈希标签节点之间没有直接关系。因此,我们不需要它们之间的直接边缘。

我们的推特图形模型准备好了!这就是它。

这是我们的示例推文的图表。

让我们在列表中添加几条推文。

推文:

So many good talks at #graphqlconf, next year I'll make sure to be *at least* in the audience!

Also huge thanks to the live tweeting by @dgraphlabs for alleviating the FOMO 😊#GraphDB ♥️ #GraphQL https://t.co/5uDpbswFZi

— francesc (@francesc)  June 21, 2019

Let's Go and catch @francesc at @Gopherpalooza today, as he scans into Go source code by building its Graph in Dgraph!

Be there, as he Goes through analyzing Go source code, using a Go program, that stores data in the GraphDB built in Go!#golang #GraphDB #Databases #Dgraph pic.twitter.com/sK90DJ6rLs

— Dgraph Labs (@dgraphlabs)  November 8, 2019

我们将使用这两条推文和示例推文,我们在开始时将其用作数据集。打开Ratel,转到mutate选项卡,粘贴突变,然后单击Run。

{
  "set": [
    {
      "user_handle": "hackintoshrao",
      "user_name": "Karthic Rao",
      "uid": "_:hackintoshrao",
      "authored": [
        {
          "tweet": "Test tweet for the fifth episode of getting started series with @dgraphlabs. Wait for the video of the fourth one by @francesc the coming Wednesday!\n#GraphDB #GraphQL",
          "tagged_with": [
            {
              "uid": "_:graphql",
              "hashtag": "GraphQL"
            },
            {
              "uid": "_:graphdb",
              "hashtag": "GraphDB"
            }
          ],
          "mentioned": [
            {
              "uid": "_:francesc"
            },
            {
              "uid": "_:dgraphlabs"
            }
          ]
        }
      ]
    },
    {
      "user_handle": "francesc",
      "user_name": "Francesc Campoy",
      "uid": "_:francesc",
      "authored": [
        {
          "tweet": "So many good talks at #graphqlconf, next year I'll make sure to be *at least* in the audience!\nAlso huge thanks to the live tweeting by @dgraphlabs for alleviating the FOMO😊\n#GraphDB ♥️ #GraphQL",
          "tagged_with": [
            {
              "uid": "_:graphql"
            },
            {
              "uid": "_:graphdb"
            },
            {
              "hashtag": "graphqlconf"
            }
          ],
          "mentioned": [
            {
              "uid": "_:dgraphlabs"
            }
          ]
        }
      ]
    },
    {
      "user_handle": "dgraphlabs",
      "user_name": "Dgraph Labs",
      "uid": "_:dgraphlabs",
      "authored": [
        {
          "tweet": "Let's Go and catch @francesc at @Gopherpalooza today, as he scans into Go source code by building its Graph in Dgraph!\nBe there, as he Goes through analyzing Go source code, using a Go program, that stores data in the GraphDB built in Go!\n#golang #GraphDB #Databases #Dgraph ",
          "tagged_with": [
            {
              "hashtag": "golang"
            },
            {
              "uid": "_:graphdb"
            },
            {
              "hashtag": "Databases"
            },
            {
              "hashtag": "Dgraph"
            }
          ],
          "mentioned": [
            {
              "uid": "_:francesc"
            },
            {
              "uid": "_:dgraphlabs"
            }
          ]
        },
        {
          "uid": "_:gopherpalooza",
          "user_handle": "gopherpalooza",
          "user_name": "Gopherpalooza"
        }
      ]
    }
  ]
}

这是我们建立的图表。 

我们的图表有:

五个蓝色twitter用户节点。

绿色节点是tweets。

蓝色的是标签。

让我们通过查询数据库中的推特用户来开始我们的推特探索。

{
  tweet_graph(func: has(user_handle)) {
     user_handle
  }
}

我们有四个推特用户:@hackintoshrao、@francesc、@dgraphlabs和@gopherpalooza。

现在,我们也来看看他们的推文和标签。

{
  tweet_graph(func: has(user_handle)) {
     user_name
     authored {
      tweet
      tagged_with {
        hashtag
      }
    }
  }
}

2、字符串索引和查询

1、哈希索引 hash

让我们编写一个查询,上面写着: Hey Dgraph, find me the tweets of user with twitter handle equals 的推文。

在这样做之前,我们首先需要向user_handle谓词添加一个索引。我们知道有5种类型的字符串索引:hash, exact, term, full-text, and trigram.。

要使用的字符串索引类型取决于要对字符串谓词运行的查询类型。

在这种情况下,我们希望根据谓词的确切字符串值搜索节点。对于像这样的用例,建议使用hash索引。

让我们首先将hash索引添加到user_handle谓词。

现在,让我们使用eq比较器来查找hackintoshrao的所有推文。

转到查询选项卡,键入查询,然后单击运行。

 {
  tweet_graph(func: eq(user_handle, "hackintoshrao")) {
     user_name
     authored {
		tweet
    }
  }
}

 让我们扩展最后一个查询,以获取hashtags 和mentions。

{
  tweet_graph(func: eq(user_handle, "hackintoshrao")) {
     user_name
     authored {
      tweet
      tagged_with {
        hashtag
      }
      mentioned {
        user_name
      }
    }
  }
}

2、精确索引 exact

hash, exact, term, full-text, and trigram.五个比较器函数都可以应用于字符串谓词。

我们已经使用了eq运算符。其他四个对操作很有用,这取决于字符串的字母顺序。

让我们通过一个简单的例子来了解它。

让我们按字母顺序查找在dgraphlabs之后的推特帐户。

{
  using_greater_than(func: gt(user_handle, "dgraphlabs")) {
    user_handle
  }
}

哎呀,我们出错了!

从错误中可以看出,user_handle谓词上的当前hash索引不支持gt函数。

为了能够执行类似于上面的字符串比较操作,您需要首先在字符串谓词上设置exact的索引。

exact索引是唯一允许您在字符串谓词上使用ge、gt、le、lt比较器的字符串索引。

提醒您,exact索引还允许您使用等于(eq)比较器。但是,如果您只想在字符串谓词上使用equals to(eq)比较器,那么使用精确的索引将是一种过度使用。hash索引将是一个更好的选择,因为它通常更节省空间。

让我们来看看实际的索引。

我们再次出现错误!

虽然一个字符串谓词可以有多个索引,但其中一些索引彼此不兼容。一个这样的例子是hash和exact索引的组合。

user_handle谓词已经具有hash索引,因此尝试设置exact索引会导致错误。

让我们取消选中user_handle谓词的hash索引,选择exact索引,然后单击update。

虽然Dgraph允许您更改谓词的索引类型,但只有在必要时才这样做。当索引更改时,数据需要重新索引,这需要一些计算,因此可能需要一些时间。当重新索引操作运行时,所有突变都将被搁置。

现在,让我们重新运行查询。

结果包含三个推特句柄:francesc、gopherpalooza和hackintosrao。

按字母顺序排列,这些twitter句柄大于dgraphlabs。

有些推文比其他推文更吸引我们。例如,我喜欢Graphs和Go。因此,我肯定会喜欢与这些主题相关的推文。基于关键字的搜索是查找相关信息的有用方法。

我们可以根据一个或多个与您兴趣相关的关键词搜索推文吗?

3、术语索引 Term 

Term 索引允许您基于一个或多个关键字搜索字符串谓词。这些关键字称为Term 。

为了能够使用特定的关键字或Term 搜索推文,我们需要首先设置推文的Term 索引。

添加Term 索引类似于添加任何其他字符串索引。

Dgraph提供了两个专门用于搜索术语的内置函数:allofterms和anytheterms。

除了这两个函数,术语索引仅支持eq比较器。这意味着任何其他查询函数(如lt、gt、le…)在使用术语索引的字符串谓词上运行时都会失败。

我们很快将查看包含字符串索引及其支持的查询函数的表。但首先,让我们学习如何使用任何therms和allofterms查询函数。让我们编写一个查询,以查找包含术语或关键字Go或Graph的所有推文。

转到查询选项卡,粘贴查询,然后单击运行。

{
  find_tweets(func: anyofterms(tweet, "Go Graph")) {
    tweet
  }
}

下面是来自查询响应的匹配推文: 

{
        "tweet": "Let's Go and catch @francesc at @Gopherpalooza today, as he scans into Go source code by building its Graph in Dgraph!\nBe there, as he Goes through analyzing Go source code, using a Go program, that stores data in the GraphDB built in Go!\n#golang #GraphDB #Databases #Dgraph "
}

anytherms函数返回具有Go或Graph关键字的tweet。

在本例中,我们只使用了两个术语来搜索(Go和Graph),但您可以扩展任意数量的术语来搜索或匹配。

结果是数据库中三条推文中的一条。另外两条推文没有得到结果,因为它们没有Go或Graph这两个术语。

还需要注意的是,术语搜索函数(任意一个词和异体词)对大小写和特殊字符不敏感。

这意味着,如果搜索术语GraphQL,查询将返回与tweets中找到的以下所有术语的正匹配:GraphQL、GraphQL、#GraphQL、#GraphQL。

现在,让我们来查找包含Go或GraphQL这两个术语的推文。

{
  find_tweets(func: anyofterms(tweet, "Go GraphQL")) {
    tweet
  }
}

哦,哇,结果中有三条推特。这意味着,这三条推文都有Go或GraphQL这两个术语。

让我们找出其中同时包含关键字GraphQL和GraphDB的推文。

{
  "tweet": "Test tweet for the fifth episode of getting started series with @dgraphlabs. Wait for the video of the fourth one by @francesc the coming Wednesday!\n#GraphDB #GraphQL"
},
{
  "tweet": "So many good talks at #graphqlconf, next year I'll make sure to be *at least* in the audience!\nAlso huge thanks to the live tweeting by @dgraphlabs for alleviating the FOMO😊\n#GraphDB ♥️ #GraphQL"
}

我们在一个结果中有两条tweet,其中包含GraphQL和GraphDB这两个术语。 

 这里是包含我们了解的三个字符串索引及其兼容的内置函数的表。

4、hash、exact、term对应函数

二、高级文本搜索

在本节,我们将继续学习Dgraph中的高级文本搜索功能。

具体来说,我们将关注两个高级功能:

使用全文搜索搜索推文。

使用正则表达式搜索搜索哈希标签。

1、全文搜索  Full text search

在我们学习如何使用全文搜索功能之前,了解何时使用它很重要。

字符串谓词值中的单词长度和数量取决于谓词表示的内容。

一些字符串谓词值中只有几个词。 代表名称、标签、推特句柄、城市、名称的谓词是几个很好的例子。这些谓词很容易使用它们的精确值进行查询。

例如,下面是一个示例查询。

给我所有用户名等于约翰·坎贝尔的推文。

在向字符串谓词添加hashexact索引后,可以轻松地编写这样的查询。

但是,一些字符串谓词存储句子。有时甚至包含一段或多段文本数据。代表推特、生物、博客、文章、产品描述或电影评论的谓词只是一些例子。查询这些谓词相对困难。

使用hashexact的字符串索引查询这样的谓词是不实际的。使用术语索引进行基于关键字的搜索是查询此类谓词的良好起点。我们在上一篇教程中使用它来查找与GraphQL、Graphs和Go等关键字完全匹配的推文。

但是,对于某些用例,仅仅基于关键字的搜索可能是不够的。您可能需要更强大的搜索功能,这时您应该考虑使用全文搜索。

让我们编写一些查询并详细了解Dgraph的全文搜索功能。

为了能够进行全文搜索,您需要首先在tweet谓词上设置全文索引。

在任何字符串谓词上创建全文索引与创建任何其他字符串索引类似。

现在,让我们进行一个全文搜索查询,以查找与以下主题相关的推文:图形数据并在graphdb中分析它。

您可以通过在内置函数中使用alloftext或anythetext来实现这一点。这两个函数都有两个参数。第一个参数是要搜索的谓词。第二个参数是要搜索的空格分隔的字符串值,我们将它们称为搜索字符串。

转到查询选项卡,在下面粘贴查询,然后单击运行。这是我们的搜索字符串:graph data and analyze it in graphdb.

{
  search_tweet(func: alloftext(tweet, "graph data and analyze it in graphdb")) {
    tweet
  }
}

这是一条匹配的推文,这条推文促成了结果。 

Let's Go and catch @francesc at @Gopherpalooza today, as he scans into Go source code by building its Graph in Dgraph!

Be there, as he Goes through analyzing Go source code, using a Go program, that stores data in the GraphDB built in Go!#golang #GraphDB #Databases #Dgraph pic.twitter.com/sK90DJ6rLs

— Dgraph Labs (@dgraphlabs) November 8, 2019

        如果你观察,你可以看到搜索字符串中的一些单词没有出现在匹配的推文中,但推文仍然能够到达结果。为了能够有效地使用全文搜索功能,我们必须了解它的工作原理。让我们详细了解一下。

        一旦在推文上设置了全文索引,就会在内部处理推文,并生成全文标记。然后对这些全文标记进行索引。搜索字符串也经过相同的处理管道,全文标记也生成了它们。以下是生成全文标记的步骤:

1、将推文分成称为标记(tokenizing)的单词块。

2、将这些标记转换为小写。

3、Unicode规范化令牌。

4、将令牌减少到其根形式,这称为词干(run-to-run,fast-to-fast等等)。

5、删除停止词。

在之前的文章中,您会看到Dgraph允许您构建多语言应用程序。

并非所有语言都支持删除词干和停止词。这里是指向文档的链接,其中包含语言列表及其对词干和停止词删除的支持。

这是第一列中包含匹配的推文及其搜索字符串的表。第二列包含Dgraph生成的相应全文标记。

从上表中,您可以看到tweets被缩减为字符串或令牌的数组。

Dgraph内部使用Bleve包来进行词干处理。

以下是为搜索字符串生成的全文标记:[analyz,data,graph,graphdb]。

从上表中可以看到,为搜索字符串生成的所有全文标记都存在于匹配的tweet中。因此,alloftext函数返回推特的正匹配。即使搜索字符串中的某个标记在推特中丢失,它也不会返回正匹配。但是,只要tweets和搜索字符串至少有一个共同的标记,anythetext函数就会返回一个正匹配。

Dgraph生成相同的全文标记,即使搜索字符串中的单词顺序不同。因此,使用不同顺序的相同搜索字符串不会影响查询结果。

如您所见,下面的三个查询对于Dgraph都是相同的。

{
  search_tweet(func: alloftext(tweet, "graph analyze and it in graphdb data")) {
    tweet
  }
}


{
  search_tweet(func: alloftext(tweet, "data and data analyze it graphdb in")) {
    tweet
  }
}


{
  search_tweet(func: alloftext(tweet, "analyze data and it in graph graphdb")) {
    tweet
  }
}

2、正则表达式搜索  regexp

正则表达式是表达搜索模式的强大方式。Dgraph允许您基于正则表达式搜索字符串谓词。您需要在字符串谓词上设置trigram 索引,以便能够执行基于正则表达式的查询。

使用基于正则表达式的搜索,让我们匹配具有此特定模式的所有哈希标签:以任意长度不定的字符开头和结尾,但其中包含子字符串图。

下面是我们可以使用的正则表达式:^.*graph*$

如果您不熟悉编写正则表达式,请查看本教程​​​​​​​

让我们首先使用has()函数查找数据库中的所有标签。

{
  hash_tags(func: has(hashtag)) {
    hashtag
  }
}

您可以看到,我们总共有六个hashtag,其中四个包含子字符串图:Dgraph、GraphQL、graphqlconf、graphDB。

我们应该使用内置函数正则表达式来搜索谓词。这个函数有两个参数,第一个是谓词的名称,第二个是正则表达式。下面是regexp函数的语法:

regexp(谓词,/表达式/)

让我们执行以下查询以查找具有子字符串图的哈希标签。

转到查询选项卡,键入查询,然后单击运行。

{
  reg_search(func: regexp(hashtag, /^.*graph.*$/)) {
    hashtag
  }
}

哎呀!我们有一个错误!看起来我们忘记在hashtag谓词上设置regexp索引了。 

同样,设置regexp索引类似于设置任何其他字符串索引,让我们对hashtag谓词进行设置。 

现在,让我们重新运行regexp查询。 

但我们在结果中只有以下散列标签:Dgraph和graphqlconf。

这是因为默认情况下正则表达式函数区分大小写。

在regexp函数的第二个参数的末尾添加字符i,使其不区分大小写:regexp(谓词,/reformal expression/i)

 现在我们有四个带有子字符串图的标签。

让我们修改正则表达式,以仅匹配前缀为graph的哈希标签。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值