OrientDB查找顶点与另一个顶点

时间:2015-08-04 16:09:40

标签: orientdb

我发现了OrientDB,我遇到了一个问题:

我有两个顶点定义:

 Product
 Criterion

一个Edge定义:

 - IsRelatedToEdge

感谢IsRelatedToEdge,我可以将一个产品链接到多个标准

在我的例子中,我用5个产品填充了数据库

 shoe-1
 shoe-2
 shoe-3
 hat-1
 hat-2

和4个标准:      蓝色      红色      帽子      鞋

然后我用这种方式将产品与标准联系起来:

 shoe-1 <=> shoe
 shoe-1 <=> blue
 shoe-2 <=> shoe
 shoe-2 <=> red
 shoe-3 <=> shoe
 shoe-3 <=> blue
 hat-1 <=> shoe
 hat-1 <=> blue
 hat-2 <=> hat
 hat-2 <=> red

所以我们有2个蓝色的鞋子,1个蓝色的帽子,1个红色的鞋子,1个红色的帽子。

我无法弄清楚如何找到所有蓝色鞋子。

编辑:我找到了一个解决方案&#39;但它看起来并不好:

select from Product where 
    in('IsRelatedToEdge')[name="blue"].size() = 1 and
    in('IsRelatedToEdge')[name="shoe"].size() = 1

2 个答案:

答案 0 :(得分:1)

IMO,OrientDB的强大之处在于图表能力,而对表/索引的查询并不能真正利用这一点。我觉得做这个查询的最好方法是获得鞋子标准,然后获得所有符合标准的产品。从这些产品(即所有鞋子)中,您现在可以过滤那些也具有蓝色标准边缘的产品。写这个的一种方法如下......

select * 
from (select expand(both('IsRelatedToEdge')) from Criterion where name = 'Shoe') 
let $blue_criterion = (select from Criterion where name = 'Blue')
where both('IsRelatedToEdge') contains $blue_criterion[0]

进一步考虑上述思维过程,您可以考虑重新安排数据以便更好/更轻松地查询。例如,您可以创建一个Hat和Shoe类,它们都是Product的子类。通过这种方式查询鞋子,您只能查询Shoe顶点类。同样,您可以制作不同的条件子类,例如Color。要获得具有这样配置的蓝色鞋子,查询将具有以下内容......

select * 
from Shoes
let $blue_criterion = (select from Color where name = 'Blue')
where both('IsRelatedToEdge') contains $blue_criterion[0]

您甚至可以制作更具体的边缘,以便更进一步。

答案 1 :(得分:1)

在研究了neRok的解决方案之后,我找到了这个解决方案:

select expand($result)
let
       $crit1 = (select expand(out('IsRelatedToEdge')) from Criterion where name='blue'),
       $crit2 = (select expand(out('IsRelatedToEdge')) from Criterion where name='shoe'),
       $result = intersect($crit1, $crit2)

通过这种查询,我可以添加另一个标准。 想象一下,如果我们有一个名为adidas的anotehr标准,我想拥有所有蓝色adidas鞋子:

select expand($result)
    let
           $crit1 = (select expand(out('IsRelatedToEdge')) from Criterion where name='blue'),
           $crit2 = (select expand(out('IsRelatedToEdge')) from Criterion where name='shoe'),
           $crit3 = (select expand(out('IsRelatedToEdge')) from Criterion where name='adidas'),
           $result = intersect($crit1, $crit2, $crit3)