OrientDB中的两步查询

OrientDB中的两步查询,orientdb,Orientdb,在这个简单的玩具示例中,我正在评估OrientDB和Neo4j,它由以下部分组成: 员工,由eid识别 会议,由mid标识,具有编码开始和结束日期时间的start和end属性 这两个实体由不同类别的顶点表示,即Employee和CalendarEvent,它们通过包含边连接,指定CalendarEvent-[包含]->Employee 我的任务是编写一个查询,为每对员工返回他们第一次会议的日期/时间以及他们共同参加的会议次数。 在Cypher中,我会这样写: MATCH (e0: Emplo

在这个简单的玩具示例中,我正在评估OrientDB和Neo4j,它由以下部分组成:

  • 员工,由eid识别
  • 会议,由
    mid
    标识,具有编码开始和结束日期时间的
    start
    end
    属性
这两个实体由不同类别的顶点表示,即
Employee
CalendarEvent
,它们通过
包含
边连接,指定
CalendarEvent-[包含]->Employee

我的任务是编写一个查询,为每对员工返回他们第一次会议的日期/时间以及他们共同参加的会议次数。 在Cypher中,我会这样写:

MATCH (e0: Employee)<-[:INVOLVES]-(c:CalendarEvent)-[:INVOLVES]->(e1: Employee)
WHERE e0.eid > e1.eid
RETURN e0.eid, e1.eid, min(c.start) as first_met, count(*) as frequency
但我觉得这太复杂了。
有人知道是否有更简单的方法来表达相同的查询吗?

是的,您的查询是正确的,这就是您在当前版本(2.1.x)中必须执行的操作

从2.2开始,使用MATCH语句(),您将能够编写一个非常类似于Cypher版本的查询:

select eid0, eid1, min(start) as firstMet, count(*) from (
    MATCH {class:Person, as:e0}.in("Involves"){as: meeting}.out("Involves"){as:e1}
    return e0.eid as eid0, e1.eid as eid1, meeting.start as start
) group by eid0, eid1

此功能在beta版之前,可能在最终版本中,MATCH语句本身会有更多运算符,查询会更短

参数nt是什么意思?对不起,我忘记替换它了。我应该写“eid”。我编辑了这个问题。格拉齐·米勒,路易吉:)
select eid0, eid1, min(start) as firstMet, count(*) from (
    MATCH {class:Person, as:e0}.in("Involves"){as: meeting}.out("Involves"){as:e1}
    return e0.eid as eid0, e1.eid as eid1, meeting.start as start
) group by eid0, eid1