我们正在使用OrientDB的v.1.7-rc2版本,嵌入在我们的应用程序中,我正在努力找出从另一组结果中删除一组结果的查询。
对于一个简化的例子,我们有一个类型" A"它以方向层次结构组织。这个班级有一个名字"属性定义为字符串(指区域,区域,县,城市等),以及"父母" edge定义从子实例到父实例的关系。
我能够使用instance()函数找到我的层次结构的两个子查询中的结果集的交集:
select expand( $1 ) LET $2 = ( select from (traverse in('parent') from (select from A where name = 'Eastern')) where $depth > 0 and name like '%a%' ), $3 = ( select from (traverse in('parent') from (select from A where name = 'Eastern')) where $depth > 0 and name like '%o%' ), $1 = intersect( $2, $3 )
如果我使用了差异()函数,我认为我可以完成相反的效果:
select expand( $1 ) LET $2 = ( select from (traverse in('parent') from (select from A where name = 'Eastern')) where $depth > 0 and name like '%a%' ), $3 = ( select from (traverse in('parent') from (select from A where name = 'Eastern')) where $depth > 0 and name like '%o%' ), $1 = difference( $2, $3 )
但它返回零记录,当$ 2和$ 3的子查询单独运行时返回重叠的记录集。我什么不明白?我已经搜索了论坛和文档,但还没有弄清楚。
最后,我想在一个结果集中找到顶点,并从中删除在第二个结果集中找到的任何顶点。我基本上想要SQL EXCEPT运算符(https://en.wikipedia.org/wiki/Set_operations_%28SQL%29#EXCEPT_operator)的类似行为。
任何想法或指示都会非常有用!
此致
安德鲁