postgresql 如何根据图数据库中顶点与物品价格的关系为顶点添加“昂贵米”属性?

2guxujil  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(151)

我有一个图形数据库,存储餐馆及其菜单项的数据。数据库中的顶点分别标记为"Restaurant""Item""Item"顶点通过"OFFERS"边连接到"Restaurant"顶点。
数据库中的每个项目都具有诸如价格、名称和描述等属性。一些餐厅有一个"expensive_meter"属性与他们相关联,而其他没有。

-- Restaurants (vertex)
SELECT * FROM cypher('DeliveryGraph', $$
    MATCH (v:Restaurant)
    RETURN v.name, v.expensive_meter, v.type, v.address
$$) AS (name agtype, expensive_meter agtype, type agtype, address agtype);

             name             | expensive_meter |         type          |                       address                       
------------------------------+-----------------+-----------------------+-----------------------------------------------------
 "Pagliacci Pizza"            |                 | "Pizzeria"            | "10600 Main St, Bellevue, WA 98004, U.S"
 "MOD Pizza"                  | 1               | "Pizzeria"            | "317 Bellevue Way NE, Bellevue, WA 98004, U.S"
 "Ascend Prime Steak & Sushi" | 4               | "Steakhouse/Japanese" | "10400 NE 4th St Ste 3100, Bellevue, WA 98004, U.S"
(3 rows)

-- Items (vertex)
SELECT * FROM cypher('DeliveryGraph', $$
    MATCH (v:Item)
    RETURN v.name, v.type, v.price
$$) AS (name agtype, type agtype, price agtype);

                name                 |   type    | price 
-------------------------------------+-----------+-------
 "Diavola"                           | "Pizza"   | 25.99
 "Chicken Primo"                     | "Pizza"   | 30.49
 "The Rocket"                        | "Pizza"   | 25.99
 "Mad Dog"                           | "Pizza"   | 10.27
 "Tristan"                           | "Pizza"   | 10.27
 "Jasper"                            | "Pizza"   | 10.27
 "PAT LAFRIEDA PRIME AMERICAN STEAK" | "Beef"    | 87.0
 "PREMIUM OMAKASE"                   | "Sushi"   | 80.0
 "HIVE"                              | "Dessert" | 68.0
(9 rows)

-- OFFERS (edge)
SELECT * FROM cypher('DeliveryGraph', $$
    MATCH (i)<-[:OFFERS]-(r)
    RETURN r.name, i.name
$$) AS (restaurant agtype, item agtype);

          restaurant          |                item                 
------------------------------+-------------------------------------
 "Pagliacci Pizza"            | "Diavola"
 "Pagliacci Pizza"            | "Chicken Primo"
 "Pagliacci Pizza"            | "The Rocket"
 "MOD Pizza"                  | "Mad Dog"
 "MOD Pizza"                  | "Tristan"
 "MOD Pizza"                  | "Jasper"
 "Ascend Prime Steak & Sushi" | "PAT LAFRIEDA PRIME AMERICAN STEAK"
 "Ascend Prime Steak & Sushi" | "PREMIUM OMAKASE"
 "Ascend Prime Steak & Sushi" | "HIVE"
(9 rows)

现在,我想将"expensive_meter"属性添加到当前没有它的"Restaurant"顶点,基于它们的项目价格与其他餐馆的"expensive_meter"值的关系。
例如,如果一家餐馆的商品大多是高价商品,则应该为其分配一个高"expensive_meter"值。相反,如果一家餐馆提供的大多是价格实惠的商品,它应该有一个较低的"expensive_meter"值。
我正在寻找如何在我的图表中实现这个逻辑的指导。我可以使用哪些步骤或算法来计算"expensive_meter"属性并根据与物品价格的关系将其分配给"Restaurant"顶点?
任何建议、代码片段或相关文档的参考都将不胜感激。提前感谢您的帮助!

o2rvlv0m

o2rvlv0m1#

要确定比萨饼的"expensive_meter",您可以将价格划分为四分位数,并计算每个四分位数内的平均价格。尽管Postgres中的ntile函数对这个任务可能很有用,但目前还不可能将其与Apache AGE中的属性一起使用。但是,您可以通过利用ApacheAGE中的percentileCont函数来实现所需的结果。
开始,让我们考虑一个例子,我们要创建5个价格组。我们可以使用以下查询确定每个组的除法值:

SELECT *
FROM cypher('DeliveryGraph', $$
    MATCH (n:Item)
    RETURN percentileDisc(n.price, 0.2), percentileDisc(n.price, 0.4), percentileDisc(n.price, 0.6), percentileDisc(n.price, 0.8), percentileDisc(n.price, 1)
$$) as (group_1 agtype, group_2 agtype, group_3 agtype, group_4 agtype, group_5 agtype);

查询提供以下结果:

group_1 | group_2 | group_3 | group_4 | group_5
---------+---------+---------+---------+---------
 10.27   | 25.99   | 30.49   | 80.0    | 87.0

根据这个结果,我们可以确定每个组的价格范围。例如,从0到10.27的价格属于第一组,大于10.27到25.99的价格属于第二组,依此类推。
现在,要为特定餐厅分配"expensive_meter"值,您可以计算该餐厅的平均价格并确定相应的价格组。然后可以将"expensive_meter"设置为组号。

SELECT *
FROM cypher('DeliveryGraph', $$
    MATCH (r:Restaurant)-[:OFFERS]->(i)
    RETURN r.name, avg(i.price)
$$) as (average_price agtype);

相关问题