【问题标题】:OreintDb Select Query IN Operator filter with traverse Subquery not workingOreintDb Select Query IN Operator filter with traverse Subquery 不起作用
【发布时间】:2021-10-31 17:42:03
【问题描述】:

我正在尝试在子查询中使用 Traverse 查询来获取顶点的过滤数据,但无法检索数据 请找到以下顶点设置步骤

CREATE CLASS Territory IF NOT EXISTS EXTENDS V
CREATE PROPERTY Territory.name IF NOT EXISTS STRING (MANDATORY TRUE)
CREATE PROPERTY Territory.subTerritories IF NOT EXISTS LINKLIST Territory

CREATE CLASS Customer IF NOT EXISTS EXTENDS V
CREATE PROPERTY Customer.CustomerNo IF NOT EXISTS STRING (MANDATORY TRUE, NOTNULL TRUE)
CREATE PROPERTY Customer.territories IF NOT EXISTS LINKLIST Territory

客户顶点数据插入 INSERT INTO CUSTOMER (CustomerNo, territories) VALUES ("Cust_1", []), ("Cust_2", []), ("Cust_3", [])

领土顶点数据插入 INSERT INTO Territory (name, subTerritories) VALUES ("All Territories", []), ("United States", []), ("East Coast", []), ("West Coast", [])

然后首先通过更新其 subTerritories 属性值来更新 Territories 记录 遵循以下结构

  All Territories 
    United States (sub territory of All territory)
        East Coast  (sub territory of United states) 
        West Coast  (sub territory of United states)

根据以下情况更新记录

  1. 将United States rid 添加到 All Territories subTerritories list
  2. 将 East Coast 和 West Coast rid's 添加到 United States Record 的 subTerritories 列表
  3. 将East Coast Territory rid to 2 个customers records添加到West Coast Territory 到剩余的单个记录

现在按照我们的要求

  • 如果客户按东海岸地区 id 过滤,那么我们应该得到 2 个客户
  • 如果客户按美国领土 ID 过滤,则它应返回东海岸和西海岸客户数据

所以我们使用遍历查询来获取区域列表,例如 如果您在下面的查询中通过美国领土,那么它将按照上述数据设置返回 3 条记录 即美国,东海岸和西海岸数据 语法: SELECT @rid FROM (TRAVERSE subTerritories FROM <UNITED_STATES_TERRITORY_RID>) 例如 SELECT @rid FROM (TRAVERSE subTerritories FROM #23:0)

我们需要将此查询用作过滤客户记录的子查询

如果我们尝试使用 In Operator 和提到的区域 id 进行普通客户查询,那么我们会得到数据 select * from customer WHERE territories.@rid IN [#24:0]

但我们需要遍历查询作为子查询来获取区域记录 ID,而不是硬编码的区域 ID

语法: select * from customer WHERE territories IN (SELECT @rid FROM (TRAVERSE subTerritories FROM <UNITED_STATES_TERRITORY_RID>)) 例如 select * from customer WHERE territories IN (SELECT @rid FROM (TRAVERSE subTerritories FROM #23:0))

但是通过这个查询,我们没有得到单个客户记录,因为它应该返回 3 个客户记录,因为东海岸客户在美国领土下

对上述子查询改进有什么建议吗?

【问题讨论】:

    标签: sql orientdb orientjs orientdb3.0 graph-query


    【解决方案1】:

    需要在子查询中使用OrientDB SQL methods(本例中为asList())。

    SELECT FROM customer WHERE territories IN (SELECT @rid.asList() FROM (TRAVERSE subTerritories FROM [#65:0,#66:0]))
    

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多