OrientDB SQL查询模拟多对多连接

时间:2016-02-17 14:09:44

标签: sql orientdb

给定使用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'

2 个答案:

答案 0 :(得分:2)

我试过这个db

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

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"

enter image description here

希望它有所帮助。

更新1

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

FROM JAVA API

enter image description here

更新2

enter image description here

FROM JAVA API

enter image description here

答案 1 :(得分:0)

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

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

第一个查询有效,是Alessandro建议的查询。它返回一个包含一个属性的文档列表,即该团队的名称。

select distinct(team.name) as name from Car

第二个查询也可以,返回团队列表(作为文档)。

select expand(distinct(team)) from Car

这第三个查询的工作原理和返回结果完全相同,因此忽略了" .name"选择的一部分。

select expand(distinct(team)).name from Car

最后一次查询失败。嗯它没有失败,但它没有返回我的预期,它返回了一个链接列表给团队。

select distinct(team).name from Car

测试运行查询:Tests