我发现了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个红色的帽子。
select from Product where
in('IsRelatedToEdge')[name="blue"].size() = 1 and
in('IsRelatedToEdge')[name="shoe"].size() = 1
答案 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)