OrientDB:如何 return 来自第一个或第二个查询的结果(如果第一个 return 没有行)
OrientDB: How to return results from first or second query (if first returned no rows)
我与部门雇员有一个共同的场景:
- 员工的上级部门由
MY_PARENT_IS
关系 设置
- 部门对其父部门使用相同的关系。
特定员工的经理可以是:
- 直接使用
IS_SPECIFIED_LEADER_FOR
设置
- 在员工的父部门中设置为
IN_CHARGE_PERSON
的第一个人(我们从给定的员工开始结构,直到找到具有 IN_CHARGE_PERSON
关系集的部门)。
示例结构:
为了实现这个目标,我有 2 个问题:
为人员获取指定领导者的第一个查询:
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)
问题是如何将这 2 个查询组合成 1 个语句,该语句要么 return 来自第一个查询或第二个查询,但前提是第一个 return 没有结果?
我玩过 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
比较?
OK,解决了,原来是我漏了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))
我与部门雇员有一个共同的场景:
- 员工的上级部门由
MY_PARENT_IS
关系 设置
- 部门对其父部门使用相同的关系。
特定员工的经理可以是:
- 直接使用
IS_SPECIFIED_LEADER_FOR
设置 - 在员工的父部门中设置为
IN_CHARGE_PERSON
的第一个人(我们从给定的员工开始结构,直到找到具有IN_CHARGE_PERSON
关系集的部门)。
示例结构:
为了实现这个目标,我有 2 个问题:
为人员获取指定领导者的第一个查询:
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)
问题是如何将这 2 个查询组合成 1 个语句,该语句要么 return 来自第一个查询或第二个查询,但前提是第一个 return 没有结果?
我玩过 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
比较?
OK,解决了,原来是我漏了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))