2014-03-27 57 views
-1

我在SO上看到过一些类似的问题,但没有一个答案对我有用,所以我希望能得到一个新的答案,自从其他问题被问到后,添加到最新版本的OrientDb。从OrientDb顶点出现边缘的存在/缺失

我想查询所有具有特定类型的传出边但没有另一类型的传出边的顶点。

正如

人的简单关系的例子----朋友--->人员

人----旗下拥有--->汽车

我想找到所有有朋友但没有车的人。

我已经尝试下面的查询,没有运气(这不论这些顶点是否具有特定种类的外出边缘返回所有的人)

select from Person where (out('Friend') not null and out('Owns').size() = 0) 
select from Person where (out('Friend') is not null and out('Owns') is null) 

在我的努力,我意识到,按照此页面,WHERE子句中的OrientDb不支持NOT查询:https://github.com/orientechnologies/orientdb/wiki/SQL-Where 有人可以请验证这是否属实。

无论如何,我继续前进,试图简化我的查询,并试图找到只有没有'拥有'的传出边缘的顶点。即使是没有工作的,因为它似乎返回所有的人在顶我的图:

select from Person where (out('Owns').size() = 0) 
select from Person where (out('Owns') is null) 

我失踪不知道是什么,但任何帮助是一如既往不胜感激。

回答

3

尝试用大小一直在努力,像这样:

select from Person where outE('Friend').size() > 0 and outE('Owns').size() = 0 
+0

卢卡,这似乎工作。谢谢。我发现你在上面的查询中单独使用outE和out。两者似乎都适合我。我们应该在使用哪一个时有什么区别? 另外,是在东方识别的空查询。它在尝试执行查询时不会发生错误,因此在我们使用它时有特定的时间。当我们可以使用空值时,您可以举一个例子吗?谢谢。 – Rohit

+0

我修正了这个问题:outE比out更便宜,因为您不用加载附加的顶点就可以评估边。但两者兼而有之。关于NULL你不知道什么时候一个集合是NULL或者只是空的(在删除之后),所以最好使用size(),如果为null,那么应该是0. – Lvca

+0

这很有道理。谢谢。现在接受你的答案:) – Rohit

-2

然而,我的查询返回不同 选择从客户那里欧特( '电子邮件')尺寸()> 0。 0项

从客户选择哪里outE('email')不是NULL; 许多项目返回

在我看来“大小()> 0”是不一样的“不空”

对不起,如果我错了