OrientDB SQL 模拟多对多连接的查询

OrientDB SQL query to emulate a many to many join

给定以下使用 OrientDB 文档创建的模式 API:

    OClass team = getoDocDatabase().getMetadata().getSchema().createClass(TEAM);
    team.createProperty(NAME, OType.STRING);

    OClass driver = getoDocDatabase().getMetadata().getSchema().createClass(DRIVER);
    driver.createProperty(NAME, OType.STRING);

    OClass car = getoDocDatabase().getMetadata().getSchema().createClass(CAR);
    car.createProperty(NAME, OType.STRING);

    // Relationships
    team.createProperty(CARS_HERITAGE, OType.LINKSET, car);
    car.createProperty(BUILT_BY, OType.LINK, team);
    car.createProperty(DRIVEN_BY, OType.LINKSET, driver);
    driver.createProperty(DRIVER_OF, OType.LINKSET, car);

获取费尔南多·阿隆索效力过的所有球队的sql查询是什么?

在关系中 SQL 就像

SELECT team.name FROM {the join} where driver.name = 'Fernando Alonso'

我试过这个数据库

create class Team
CREATE PROPERTY Team.name String

create class DRIVER
CREATE PROPERTY DRIVER.name String

create class Car
CREATE PROPERTY Car.name String

CREATE PROPERTY Team.CARS_HERITAGE LINKSET Car
CREATE PROPERTY Car.BUILT_BY LINK Team
CREATE PROPERTY Car.DRIVEN_BY LINKSET DRIVER
CREATE PROPERTY DRIVER.DRIVER_OF LINKSET Car

插入

INSERT INTO TEAM(name) values ("Ferrari"),("Renault") // Ferrari 12:0  Renault 12:1
insert into Driver(name) values ("Fernando Alonso"),("Giancarlo Fisichella") // Alonso 13:0  Fisichella 13:1
insert into car(name,BUILT_BY,DRIVEN_BY) values ("car ferrari",#12:0,[#13:0,#13:1])
insert into car(name,BUILT_BY,DRIVEN_BY) values ("car renault",#12:1,[#13:0])

查询

select BUILT_BY.name as TeamName from car where DRIVEN_BY.name contains "Fernando Alonso"

希望对您有所帮助。

更新 1

select distinct(BUILT_BY.name) as team from car where DRIVEN_BY.name contains "Fernando Alonso"

来自 JAVA API

更新 2

来自 JAVA API

@Alessandro 的回答是正确的,但是我发现 sql 的解释方式有些奇怪。让我解释一下。

我已经简化了目标,让我们尝试查找查询以获取至少拥有一辆汽车的车队。

第一个查询有效,是亚历山德罗建议的。它 return 是一个文件列表,其中包含一个 属性,即团队的名称。

select distinct(team.name) as name from Car

第二个查询也有效,return正在获取团队列表(作为文档)。

select expand(distinct(team)) from Car

第三个查询有效并且 return 的结果与前一个完全相同,因此它忽略了 select.

的“.name”部分
select expand(distinct(team)).name from Car

最后一次查询失败。好吧,它没有失败,但它没有 return 我所期望的,它 return 是一个指向团队的链接列表。

select distinct(team).name from Car

测试 运行 查询:Tests