承承承接上文 顺序观看,效果更佳
目录
一、 模糊搜索
现在,您应该有一个包含推文、用户和标签的图表,我们可以对其进行探索。
如果没有的话,链接:
1、了解模糊搜索
如果不存在完全匹配项,则提供产品或用户名的搜索功能需要搜索与字符串最接近的匹配项。即使有拼写错误或用户没有根据存储的确切名称进行搜索,此功能也可以帮助您获得相关结果。这正是模糊搜索所做的:它比较字符串值并返回最接近的匹配项。因此,它非常适合我们在twitter用户名上实现搜索的用例。
模糊搜索的功能基于Dgraph中存储的用户名值与搜索字符串之间的Levenshtein距离。
Levenshtein距离是定义两个字符串的接近度的度量。两个单词之间的Levenshtein距离是将一个单词更改为另一个单词所需的单个字符编辑(插入、删除或替换)的最小数量。
例如,字符串book和back之间的Levenshtein距离是2。2的值是合理的,因为通过更改两个字符,我们将单词book更改为back。
现在您已经了解了模糊搜索是什么以及它可以做什么。接下来,让我们学习如何在Dgraph中的字符串谓词上使用它。
2、在Dgraph中实现模糊搜索
在Dgraph中对字符串谓词使用模糊搜索,首先要设置trigram 索引。
转到Schema选项卡,在user_name谓词上设置trigram 索引。
在user_name谓词上设置trigram 索引后,可以使用Dgraph的内置函数match来运行模糊搜索查询。下面是match函数的语法:
match(谓词、搜索字符串、距离)
匹配函数接受三个参数:
用于查询的字符串谓词的名称。
用户提供的搜索字符串
表示前两个参数之间的最大Levenshtein距离的整数。该值应大于0。例如,当整数为8时,返回距离值小于或等于8的谓词。
使用较大的距离参数值可能会匹配更多的字符串谓词,但也会产生不太准确的结果。
在使用match函数之前,让我们先获取存储在数据库中的用户名列表。
{
names(func: has(user_name)) {
user_name
}
}
从结果中可以看到,我们有四个用户名:Gopherpalooza、Karthic Rao、Francesc Campoy和Dgraph Labs。
首先,我们将Levenshtein Distance参数设置为3。我们希望Dgraph返回与提供的搜索字符串相距三个或更少距离的所有用户名谓词。
然后,我们将第二个参数(用户提供的搜索字符串)设置为graphLabs。
转到查询选项卡,在下面粘贴查询,然后单击运行。
{
user_names_Search(func: match(user_name, "graphLabs", 3)) {
user_name
}
}
因为搜索字符串graphLabs与Dgraph Labs的谓词值相距2,所以我们可以在搜索结果中看到它。
让我们再次运行上面的查询,但这次我们将使用搜索字符串graphLab。转到查询选项卡,在下面粘贴查询,然后单击运行。
{
user_names_Search(func: match(user_name, "graphLab", 3)) {
user_name
}
}
我们仍然得到了user_name谓词与值Dgraph Labs的正匹配!这是因为搜索字符串graphLab与Dgraph Labs的谓词值相距3,所以我们在搜索结果中看到了它。
在本例中,搜索字符串graphLab和谓词Dgraph Labs之间的Levenshtein距离为3,因此匹配。
对于查询的最后一次运行,让我们将搜索字符串更改为Dgraph,但保持Levenshtein距离为3。
{
user_names_Search(func: match(user_name, "Dgraph", 3)) {
user_name
}
}
现在,您不再看到Dgraph Labs出现在搜索结果中,因为Dgraph和Dgraph Lab之间的距离大于3。但基于正常的人类理性,当使用Dgraph作为搜索字符串时,您自然会期望Dgraph Labs出现在检索结果中。
这是基于Levenshtein距离算法的模糊搜索的缺点之一。模糊搜索的有效性随着距离参数值的降低而降低,并且随着字符串谓词中包含的单词数量的增加而降低。
因此,不建议对可能包含许多单词的字符串谓词使用模糊搜索,例如,存储博客文章、生物、产品描述等值的谓词。因此,使用模糊搜索的理想候选是名称、邮政编码、位置等谓词,其中字符串谓词中的单词数通常在1-3之间。
此外,根据用例,调整距离参数对于模糊搜索的有效性至关重要。
二、本地地理定位功能
之前,我们学习了如何使用Dgraph的模糊搜索构建类似twitter的用户搜索功能。
这一次,我们将绘制旧金山周围的旅游地点图,并帮助我们的动物学家朋友玛丽和她的团队使用Dgraph的地理定位功能保护鸟类。
你可能使用谷歌搜索你附近的餐馆,或者在距离你当前位置一英里以内的购物中心。像这样的应用程序利用您的地理位置数据。地理位置已经成为移动应用程序的一个组成部分,特别是随着过去十年智能手机的出现,围绕用户位置来增强应用程序功能的应用程序列表已经超出了想象。
以优步为例,司机和乘客的位置数据对应用程序的功能至关重要。我们收集的GPS数据比以往任何时候都要多,能够高效地存储和查询位置数据可以让您在竞争对手中占据优势。真实世界的数据是相互关联的;它们并不稀疏;这与位置数据更相关。铁路网络、地图、路线的自然表示是图形。
好消息是,Dgraph是世界上最先进的图形数据库,具有高效存储和对包含位置数据的图形执行有用查询的功能。如果你想向我查询金门大桥附近的酒店或金门公园周围的所有旅游地点,Dgraph会支持你。首先,让我们学习如何在Dgraph中表示地理位置数据。
1、解析地理位置数据
可以使用两种方式在Dgraph中表示位置数据:
点位置
点位置包含感兴趣位置的地理坐标元组(纬度、经度)。
下图显示了巴黎埃菲尔铁塔的经纬度位置。点位置用于表示精确位置;例如,您预订出租车时的位置或送货地址。
多边形位置
仅使用一个点位置是不可能表示跨多个地理坐标分布的地理实体的。要表示城市、湖泊或国家公园等地理实体,应使用多边形位置。
下面是一个示例:
上面的多边形围栏代表了印度德里市。这个多边形围栏或地理围栏是通过连接多个直线边界形成的,它们使用格式为[(纬度,经度),(纬度,纬度),…]的位置元组数组来共同表示。每个元组对(2个元组和4个坐标)表示地理围栏的直线边界,多边形围栏可以包含任意数量的线。
让我们从构建一个简单的旧金山旅游图开始,这是图模型。
上图有三个由节点表示的实体:
城市 City
城市节点代表旅游城市。我们的数据集只包含旧金山市,图中的一个节点表示它。
位置节点 Location
位置节点,连同位置的名称,包含感兴趣地点的点或多边形位置。
位置类型 Location Type
位置类型由位置类型组成。我们的数据集中有四种类型的位置:动物园、博物馆、酒店或旅游景点。
具有酒店地理坐标的位置节点还包含其定价信息。
对同一图形建模有不同的方法。例如,位置类型可以只是位置节点的属性或谓词,而不是自己的节点。
您想要执行的查询或您想要探索的关系主要影响建模决策。本教程的目标不是要得到理想的图形模型,而是使用一个简单的数据集来演示Dgraph的地理定位功能。
对于本教程的其余部分,让我们将表示城市的节点称为城市节点,将表示位置的节点称位置节点,将位置类型的节点称地点类型节点。
以下是这些节点之间的关系:
每个城市节点都通过has_location边缘连接到一个位置节点。
每个位置节点都通过has_type边缘连接到表示位置类型的节点。
注意:Dgraph允许您使用其类型系统功能为节点关联一个或多个类型,目前,我们使用的是没有类型的节点。
这是我们的示例数据集。打开Ratel,转到mutate选项卡,粘贴突变,然后单击Run。
{
"set": [
{
"city": "San Francisco",
"uid": "_:SFO",
"has_location": [
{
"name": "USS Pampanito",
"location": {
"type": "Polygon",
"coordinates": [
[
[
-122.4160088,
37.8096674
],
[
-122.4161147,
37.8097628
],
[
-122.4162064,
37.8098357
],
[
-122.4163467,
37.8099312
],
[
-122.416527,
37.8100471
],
[
-122.4167504,
37.8101792
],
[
-122.4168272,
37.8102137
],
[
-122.4167719,
37.8101612
],
[
-122.4165683,
37.8100108
],
[
-122.4163888,
37.8098923
],
[
-122.4162492,
37.8097986
],
[
-122.4161469,
37.8097352
],
[
-122.4160088,
37.8096674
]
]
]
},
"has_type": [
{
"uid": "_:museum",
"loc_type": "Museum"
}
]
},
{
"name": "Alameda Naval Air Museum",
"location": {
"type": "Polygon",
"coordinates": [
[
[
-122.2995054,
37.7813924
],
[
-122.2988538,
37.7813582
],
[
-122.2988421,
37.7814972
],
[
-122.2994937,
37.7815314
],
[
-122.2995054,
37.7813924
]
]
]
},
"street": "Ferry Point Road",
"has_type": [
{
"uid": "_:museum"
}
]
},
{
"name": "Burlingame Museum of PEZ Memorabilia",
"location": {
"type": "Polygon",
"coordinates": [
[
[
-122.3441509,
37.5792003
],
[
-122.3438207,
37.5794257
],
[
-122.3438987,
37.5794587
],
[
-122.3442289,
37.5792333
],
[
-122.3441509,
37.5792003
]
]
]
},
"street": "California Drive",
"has_type": [
{
"uid": "_:museum"
}
]
},
{
"name": "Carriage Inn",
"location": {
"type": "Polygon",
"coordinates": [
[
[
-122.3441509,
37.5792003
],
[
-122.3438207,
37.5794257
],
[
-122.3438987,
37.5794587
],
[
-122.3442289,
37.5792333
],
[
-122.3441509,
37.5792003
]
]
]
},
"street": "7th street",
"price_per_night": 350.00,
"has_type": [
{
"uid": "_:hotel",
"loc_type": "Hotel"
}
]
},
{
"name": "Lombard Motor In",
"location": {
"type": "Polygon",
"coordinates": [
[
[
-122.4260484,
37.8009811
],
[
-122.4260137,
37.8007969
],
[
-122.4259083,
37.80081
],
[
-122.4258724,
37.8008144
],
[
-122.4257962,
37.8008239
],
[
-122.4256354,
37.8008438
],
[
-122.4256729,
37.8010277
],
[
-122.4260484,
37.8009811
]
]
]
},
"street": "Lombard Street",
"price_per_night": 400.00,
"has_type": [
{
"uid": "_:hotel"
}
]
},
{
"name": "Holiday Inn San Francisco Golden Gateway",
"location": {
"type": "Polygon",
"coordinates": [
[
[
-122.4214895,
37.7896108
],
[
-122.4215628,
37.7899798
],
[
-122.4215712,
37.790022
],
[
-122.4215987,
37.7901606
],
[
-122.4221004,
37.7900985
],
[
-122.4221044,
37.790098
],
[
-122.4219952,
37.7895481
],
[
-122.4218207,
37.78957
],
[
-122.4216158,
37.7895961
],
[
-122.4214895,
37.7896108
]
]
]
},
"street": "Van Ness Avenue",
"price_per_night": 250.00,
"has_type": [
{
"uid": "_:hotel"
}
]
},
{
"name": "Golden Gate Bridge",
"location": {
"type": "Polygon",
"coordinates": [
[
[
-122.479784,
37.8288329
],
[
-122.4775646,
37.8096291
],
[
-122.4775538,
37.8095165
],
[
-122.4775465,
37.8093304
],
[
-122.4775823,
37.8093296
],
[
-122.4775387,
37.8089749
],
[
-122.4773545,
37.8089887
],
[
-122.4773402,
37.8089575
],
[
-122.4772752,
37.8088285
],
[
-122.4772084,
37.8087099
],
[
-122.4771322,
37.8085903
],
[
-122.4770518,
37.8084793
],
[
-122.4769647,
37.8083687
],
[
-122.4766802,
37.8080091
],
[
-122.4766629,
37.8080195
],
[
-122.4765701,
37.8080751
],
[
-122.476475,
37.8081322
],
[
-122.4764106,
37.8081708
],
[
-122.476396,
37.8081795
],
[
-122.4764936,
37.8082814
],
[
-122.476591,
37.8083823
],
[
-122.4766888,
37.8084949
],
[
-122.47677,
37.808598
],
[
-122.4768444,
37.8087008
],
[
-122.4769144,
37.8088105
],
[
-122.4769763,
37.8089206
],
[
-122.4770373,
37.8090416
],
[
-122.477086,
37.809151
],
[
-122.4771219,
37.8092501
],
[
-122.4771529,
37.809347
],
[
-122.477179,
37.8094517
],
[
-122.4772003,
37.809556
],
[
-122.4772159,
37.8096583
],
[
-122.4794624,
37.8288561
],
[
-122.4794098,
37.82886
],
[
-122.4794817,
37.8294742
],
[
-122.4794505,
37.8294765
],
[
-122.4794585,
37.8295453
],
[
-122.4795423,
37.8295391
],
[
-122.4796312,
37.8302987
],
[
-122.4796495,
37.8304478
],
[
-122.4796698,
37.8306078
],
[
-122.4796903,
37.830746
],
[
-122.4797182,
37.8308784
],
[
-122.4797544,
37.83102
],
[
-122.479799,
37.8311522
],
[
-122.4798502,
37.8312845
],
[
-122.4799025,
37.8314139
],
[
-122.4799654,
37.8315458
],
[
-122.4800346,
37.8316718
],
[
-122.4801231,
37.8318137
],
[
-122.4802112,
37.8319368
],
[
-122.4803028,
37.8320547
],
[
-122.4804046,
37.8321657
],
[
-122.4805121,
37.8322792
],
[
-122.4805883,
37.8323459
],
[
-122.4805934,
37.8323502
],
[
-122.4807146,
37.8323294
],
[
-122.4808917,
37.832299
],
[
-122.4809526,
37.8322548
],
[
-122.4809672,
37.8322442
],
[
-122.4808396,
37.8321298
],
[
-122.4807166,
37.8320077
],
[
-122.4806215,
37.8319052
],
[
-122.4805254,
37.8317908
],
[
-122.4804447,
37.8316857
],
[
-122.4803548,
37.8315539
],
[
-122.4802858,
37.8314395
],
[
-122.4802227,
37.8313237
],
[
-122.4801667,
37.8312051
],
[
-122.4801133,
37.8310812
],
[
-122.4800723,
37.8309602
],
[
-122.4800376,
37.8308265
],
[
-122.4800087,
37.8307005
],
[
-122.4799884,
37.8305759
],
[
-122.4799682,
37.8304181
],
[
-122.4799501,
37.8302699
],
[
-122.4798628,
37.8295146
],
[
-122.4799157,
37.8295107
],
[
-122.4798451,
37.8289002
],
[
-122.4798369,
37.828829
],
[
-122.479784,
37.8288329
]
]
]
},
"street": "Golden Gate Bridge",
"has_type": [
{
"uid": "_:attraction",
"loc_type": "Tourist Attraction"
}
]
},
{
"name": "Carriage Inn",
"location": {
"type": "Polygon",
"coordinates": [
[
[
-122.3441509,
37.5792003
],
[
-122.3438207,
37.5794257
],
[
-122.3438987,
37.5794587
],
[
-122.3442289,
37.5792333
],
[
-122.3441509,
37.5792003
]
]
]
},
"street": "7th street",
"has_type": [
{
"uid": "_:attraction"
}
]
},
{
"name": "San Francisco Zoo",
"location": {
"type": "Polygon",
"coordinates": [
[
[
-122.5036126,
37.7308562
],
[
-122.5028991,
37.7305879
],
[
-122.5028274,
37.7305622
],
[
-122.5027812,
37.7305477
],
[
-122.5026992,
37.7305269
],
[
-122.5026211,
37.7305141
],
[
-122.5025342,
37.7305081
],
[
-122.5024478,
37.7305103
],
[
-122.5023667,
37.7305221
],
[
-122.5022769,
37.7305423
],
[
-122.5017546,
37.7307008
],
[
-122.5006917,
37.7311277
],
[
-122.4992484,
37.7317075
],
[
-122.4991414,
37.7317614
],
[
-122.4990379,
37.7318177
],
[
-122.4989369,
37.7318762
],
[
-122.4988408,
37.731938
],
[
-122.4987386,
37.7320142
],
[
-122.4986377,
37.732092
],
[
-122.4978359,
37.7328712
],
[
-122.4979122,
37.7333232
],
[
-122.4979485,
37.7333909
],
[
-122.4980162,
37.7334494
],
[
-122.4980945,
37.7334801
],
[
-122.4989553,
37.7337384
],
[
-122.4990551,
37.7337743
],
[
-122.4991479,
37.7338184
],
[
-122.4992482,
37.7338769
],
[
-122.4993518,
37.7339426
],
[
-122.4997605,
37.7342142
],
[
-122.4997578,
37.7343433
],
[
-122.5001258,
37.7345486
],
[
-122.5003425,
37.7346621
],
[
-122.5005576,
37.7347566
],
[
-122.5007622,
37.7348353
],
[
-122.500956,
37.7349063
],
[
-122.5011438,
37.7349706
],
[
-122.5011677,
37.7349215
],
[
-122.5013556,
37.7349785
],
[
-122.5013329,
37.7350294
],
[
-122.5015181,
37.7350801
],
[
-122.5017265,
37.7351269
],
[
-122.5019229,
37.735164
],
[
-122.5021252,
37.7351953
],
[
-122.5023116,
37.7352187
],
[
-122.50246,
37.7352327
],
[
-122.5026074,
37.7352433
],
[
-122.5027534,
37.7352501
],
[
-122.5029253,
37.7352536
],
[
-122.5029246,
37.735286
],
[
-122.5033453,
37.7352858
],
[
-122.5038376,
37.7352855
],
[
-122.5038374,
37.7352516
],
[
-122.5054006,
37.7352553
],
[
-122.5056182,
37.7352867
],
[
-122.5061792,
37.7352946
],
[
-122.5061848,
37.7352696
],
[
-122.5063093,
37.7352671
],
[
-122.5063297,
37.7352886
],
[
-122.5064719,
37.7352881
],
[
-122.5064722,
37.735256
],
[
-122.506505,
37.7352268
],
[
-122.5065452,
37.7352287
],
[
-122.5065508,
37.7351214
],
[
-122.5065135,
37.7350885
],
[
-122.5065011,
37.7351479
],
[
-122.5062471,
37.7351127
],
[
-122.5059669,
37.7349341
],
[
-122.5060092,
37.7348205
],
[
-122.5060405,
37.7347219
],
[
-122.5060611,
37.734624
],
[
-122.5060726,
37.7345101
],
[
-122.5060758,
37.73439
],
[
-122.5060658,
37.73427
],
[
-122.5065549,
37.7342676
],
[
-122.5067262,
37.7340364
],
[
-122.506795,
37.7340317
],
[
-122.5068355,
37.733827
],
[
-122.5068791,
37.7335407
],
[
-122.5068869,
37.7334106
],
[
-122.5068877,
37.733281
],
[
-122.5068713,
37.7329795
],
[
-122.5068598,
37.7328652
],
[
-122.506808,
37.7325954
],
[
-122.5067837,
37.732482
],
[
-122.5067561,
37.7323727
],
[
-122.5066387,
37.7319688
],
[
-122.5066273,
37.731939
],
[
-122.5066106,
37.7319109
],
[
-122.506581,
37.7318869
],
[
-122.5065404,
37.731872
],
[
-122.5064982,
37.7318679
],
[
-122.5064615,
37.731878
],
[
-122.5064297,
37.7318936
],
[
-122.5063553,
37.7317985
],
[
-122.5063872,
37.7317679
],
[
-122.5064106,
37.7317374
],
[
-122.5064136,
37.7317109
],
[
-122.5063998,
37.7316828
],
[
-122.5063753,
37.7316581
],
[
-122.5061296,
37.7314636
],
[
-122.5061417,
37.731453
],
[
-122.5060145,
37.7313791
],
[
-122.5057839,
37.7312678
],
[
-122.5054352,
37.7311479
],
[
-122.5043701,
37.7310447
],
[
-122.5042805,
37.7310343
],
[
-122.5041861,
37.7310189
],
[
-122.5041155,
37.7310037
],
[
-122.5036126,
37.7308562
]
]
]
},
"street": "San Francisco Zoo",
"has_type": [
{
"uid": "_:zoo",
"loc_type": "Zoo"
}
]
},
{
"name": "Flamingo Park",
"location": {
"type": "Polygon",
"coordinates": [
[
[
-122.5033039,
37.7334601
],
[
-122.5032811,
37.7334601
],
[
-122.503261,
37.7334601
],
[
-122.5032208,
37.7334495
],
[
-122.5031846,
37.7334357
],
[
-122.5031806,
37.7334718
],
[
-122.5031685,
37.7334962
],
[
-122.5031336,
37.7335078
],
[
-122.503128,
37.7335189
],
[
-122.5031222,
37.7335205
],
[
-122.5030954,
37.7335269
],
[
-122.5030692,
37.7335444
],
[
-122.5030699,
37.7335677
],
[
-122.5030813,
37.7335868
],
[
-122.5031034,
37.7335948
],
[
-122.5031511,
37.73359
],
[
-122.5031933,
37.7335916
],
[
-122.5032228,
37.7336022
],
[
-122.5032697,
37.7335937
],
[
-122.5033194,
37.7335874
],
[
-122.5033515,
37.7335693
],
[
-122.5033723,
37.7335518
],
[
-122.503369,
37.7335068
],
[
-122.5033603,
37.7334702
],
[
-122.5033462,
37.7334474
],
[
-122.5033073,
37.733449
],
[
-122.5033039,
37.7334601
]
]
]
},
"street": "San Francisco Zoo",
"has_type": [
{
"uid": "_:zoo"
}
]
},
{
"name": "Peace Lantern",
"location": {
"type": "Point",
"coordinates": [
-122.4705776,
37.7701084
]
},
"street": "Golden Gate Park",
"has_type": [
{
"uid": "_:attraction"
}
]
},
{
"name": "Buddha",
"location": {
"type": "Point",
"coordinates": [
-122.469942,
37.7703183
]
},
"street": "Golden Gate Park",
"has_type": [
{
"uid": "_:attraction"
}
]
},
{
"name": "Japanese Tea Garden",
"location": {
"type": "Polygon",
"coordinates": [
[
[
-122.4692131,
37.7705116
],
[
-122.4698998,
37.7710069
],
[
-122.4702431,
37.7710137
],
[
-122.4707248,
37.7708919
],
[
-122.4708911,
37.7701541
],
[
-122.4708428,
37.7700354
],
[
-122.4703492,
37.7695011
],
[
-122.4699255,
37.7693989
],
[
-122.4692131,
37.7705116
]
]
]
},
"street": "Golden Gate Park",
"has_type": [
{
"uid": "_:attraction"
}
]
}
]
}
]
}
运行下面的查询以获取整个图形:
{
entire_graph(func: has(city)) {
city
has_location {
name
has_type {
loc_type
}
}
}
}
这是我们的图表!
我们的图表有:
一个蓝色城市节点。我们只有一个节点,代表旧金山市。
绿色的是位置节点。我们总共有13个地点。
粉色节点表示位置类型。我们的数据集中有四种位置:博物馆、动物园、酒店和旅游景点。
您还可以看到Dgraph已经从模式选项卡自动检测到谓词的数据类型,并且位置谓词已经自动分配了地理类型。
在我们开始之前,请向玛丽问好,她是一位动物学家,致力于保护各种鸟类的事业。
在接下来的教程中,让我们帮助玛丽和她的动物学家团队完成保护鸟类的任务。
2、进入旧金山:酒店预订
玛丽做的几个研究项目表明,当有充足的水体作为栖息地时,火烈鸟会更好地繁衍生息。她的团队因在旧金山动物园扩大火烈鸟的水源而获得批准,她的团队已准备好前往旧金山,由玛丽远程监控团队的进展。
她的队友希望留在金门大桥附近,这样他们就可以在金门周围骑自行车,享受微风和每天早晨的日出。让我们帮助他们找到一家距离金门大桥合理距离内的酒店,我们将使用Dgraph的地理定位功能。
Dgraph提供了多种查询地理位置数据的功能。要使用它们,必须先设置地理索引。
转到“模式”选项卡,在位置谓词上设置索引。
在位置谓词上设置地理索引后,您可以使用Dgraph的内置函数near查找金门大桥附近的酒店。
下面是near函数的语法:
near(geo谓词,[long,lat],distance)。
near函数匹配并返回数据库中存储的所有地理谓词,这些谓词位于用户提供的geojson坐标[long,lat]的距离米以内。让我们从金门大桥上的一个点搜索距离7公里以内的酒店。
转到查询选项卡,在下面粘贴查询,然后单击运行。
{
find_hotel(func: near(location, [-122.479784,37.82883295],7000) ) {
name
has_type {
loc_type
}
}
}
等待搜索不仅返回酒店,还返回距离金门大桥上的点坐标7公里内的所有其他位置。
让我们使用@filter函数过滤仅包含酒店的搜索结果。
{
find_hotel(func: near(location, [-122.479784,37.82883295],7000)) {
name
has_type @filter(eq(loc_type, "hotel")){
loc_type
}
}
}
糟糕的是,我们在过滤器中使用eq比较器时忘记添加索引。
让我们向loc_type添加一个哈希索引,然后重新运行查询。
搜索结果仍然包含表示不是酒店的位置的节点。这是因为根查询首先找到距离指定点位置7KM以内的所有位置节点,然后在有选择地遍历位置类型节点时应用过滤器。只能在根级别过滤位置节点中的谓词,如果不遍历到位置类型节点,则无法过滤位置类型。
当我们遍历位置类型节点时,我们具有仅选择酒店的过滤器。我们是否可以将过滤器级联或冒泡到根级别,以便最终结果中只有酒店?
是的,你可以!您可以使用@ccascade指令来执行此操作。
@cascade指令帮助您将应用于内部查询遍历的筛选器级联或冒泡到根级节点,通过这样做,我们只能在结果中获得酒店的位置。
{
find_hotel(func: near(location, [-122.479784,37.82883295],7000)) @cascade {
name
price_per_night
has_type @filter(eq(loc_type,"Hotel")){
loc_type
}
}
}
瞧!您可以在结果中看到,在查询中添加@cascade指令后,结果中只显示类型为hotel的位置。
结果我们有两家酒店,其中一家超出了每晚300美元的预算。让我们添加另一个过滤器来搜索每晚低于300美元的酒店。
每个酒店的价格信息都与它们的坐标一起存储在位置节点中,因此定价过滤器应该位于查询的根级别,而不是我们遍历位置类型节点的级别。
在跳转到运行查询之前,不要忘记在price_per_night谓词上添加索引。
{
find_hotel(func: near(location, [-122.479784,37.82883295],7000)) @cascade @filter(le(price_per_night, 300)){
name
price_per_night
has_type @filter(eq(loc_type,"Hotel")){
loc_type
}
}
}
现在我们有一家在预算范围内的酒店,而且离金门大桥很近!
完结,撒花 ! (ง •̀_•́)ง (*•̀ㅂ•́)و