OrientDB:如何返回从第一或第二查询结果(如果第一个返回行)
问题描述:
我有在部门聘请的员工常见的场景:OrientDB:如何返回从第一或第二查询结果(如果第一个返回行)
- 雇员的上级部门通过
MY_PARENT_IS
关系 - 设置部门对其父部门使用同样的关系。
特定雇员的经理可以是:
- 直接设置使用
IS_SPECIFIED_LEADER_FOR
被设置为
- 第一人(我们从给定的员工上去结构直到我们找到一个与
IN_CHARGE_PERSON
关系集的部门)。
IN_CHARGE_PERSON
对员工的上级部门
结构示例:
为了实现这个目标我有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))