OrientDB:如何返回从第一或第二查询结果(如果第一个返回行)

问题描述:

我有在部门聘请的员工常见的场景:OrientDB:如何返回从第一或第二查询结果(如果第一个返回行)

  • 雇员的上级部门通过MY_PARENT_IS关系
  • 设置部门对其父部门使用同样的关系。

特定雇员的经理可以是:

  • 直接设置使用IS_SPECIFIED_LEADER_FOR
  • 被设置为 IN_CHARGE_PERSON对员工的上级部门
  • 第一人(我们从给定的员工上去结构直到我们找到一个与IN_CHARGE_PERSON关系集的部门)。

结构示例:

Example structure

为了实现这个目标我有2个疑问:

1查询来获取指定的领导者的人:

SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
      where: (Name = 'Sales Berseker 1' AND in('IS_SPECIFIED_LEADER_FOR').size() > 0)}.in('IS_SPECIFIED_LEADER_FOR') 
      {as: manager} RETURN manager) 

第二查询发现第一个经理结构(IN_CHARGE_PERSON

SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
      where: (Name = 'Sales Berseker 1')}.out('MY_PARENT_IS') 
      {while: (out('IN_CHARGE_PERSON').size() == 0), 
      where: (out('IN_CHARGE_PERSON').size() > 0)}.out('IN_CHARGE_PERSON') 
      {as: manager} RETURN manager) 

问题是如何将这两个查询合并到1语句中,该语句将返回第一个或第二个结果的结果,但仅在第一个结果返回没有结果?

我打得四处LET,但不能得到这方面的工作100%(此蒙上查询解析错误):

SELECT if($specMgr.size()>0,$specMgr,$depMgr) 
LET $specMgr = (SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
      where: (Name = 'Sales Berseker 1' AND in('IS_SPECIFIED_LEADER_FOR').size() > 0)}.in('IS_SPECIFIED_LEADER_FOR') 
      {as: manager} RETURN manager)), 
$depMgr = (SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
      where: (Name = 'Sales Berseker 1')}.out('MY_PARENT_IS') 
      {while: (out('IN_CHARGE_PERSON').size() == 0), 
      where: (out('IN_CHARGE_PERSON').size() > 0)}.out('IN_CHARGE_PERSON') 
      {as: manager} RETURN manager)) 

问题是与条件,当我删除的比较,那么至少没有错误报道,但不能按预期工作。为什么我不能在if语句中使用.size() > 0比较?

好的,解决了,原来我错过了eval(),并没有看到eval的内容必须放在引号之间。 工作查询如下:

SELECT EXPAND(if(eval('$specMgr.size() > 0'),$specMgr,$depMgr)) 
LET $specMgr = (SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
      where: (Name = 'Sales Berseker 1' AND in('IS_SPECIFIED_LEADER_FOR').size() > 0)}.in('IS_SPECIFIED_LEADER_FOR') 
      {as: manager} RETURN manager)), 
$depMgr = (SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
      where: (Name = 'Sales Berseker 1')}.out('MY_PARENT_IS') 
      {while: (out('IN_CHARGE_PERSON').size() == 0), 
      where: (out('IN_CHARGE_PERSON').size() > 0)}.out('IN_CHARGE_PERSON') 
      {as: manager} RETURN manager))