在orientdb中获取多个级别的相同顶点数据

时间:2015-03-17 13:23:01

标签: orientdb

我是OrientDB的初学者。

考虑我有2个顶点,CatVal Cat包含名为category的属性,Val包含名为value的属性。

类别可以包含子类别,也可以包含子类别等。类别和子类别存储在顶点Cat中。使用名为CatEdge的边来映射子类别,fromto是相同的顶点,即Cat

例如,考虑一个“教育”类别,它有两个子类别“学校”和“学院”。 “学院”子类别还有“Bachelors”和“Masters”等子类别。因此,CatEdge在“教育”,“学校”和“学院”,“学院”,“学士”和“硕士”方面都有优势。

Education
   |- School
   |- College
        |- Bachelors
        |- Masters

除此之外,Cat顶点可以包含没有任何子类别的类别,例如'FirstName','LastName'等。

所有“叶子”类别(没有其他子类别)都有一个从顶点ValEdge到顶点Cat的{​​{1}}边。

我想从Val检索所有类别和子类别的所有“价值”。

我做了什么:

首先,我解雇了以下查询以检索所有没有子类别且不属于其他类别的子类别的类别:

Val

然后,以编程方式,我遍历所有获取的类别并找到它们对应的值:

 select from Cat where @rid not in (select @rid, expand(both('CatEdge')) from Cat)

其次,我使用以下方式获取所有具有子类别或本身就是子类别的类别:

select expand(out('ValEdge')) from Cat where category = 'FirstName'

并将其存储在名为select from (traverse out('CatEdge') from Cat) where out('CatEdge').size() > 0 的列表中。 以上查询将给我“教育”和“学院” 使用此列表,对于每个项目,我使用以下方法检查是否存在其子类别:

SubList

以上查询将给出“学校”和“学院”。然后,我以编程方式检查select expand(out('CatEdge')) from Cat where category = 'Education' 中是否存在“学校”和“学院”。

  

如果它存在,我首先将其从SubList中删除并再次触发上述查询,并继续直到我得到零行。

     

如果SubList中不存在,那么它就是“叶子”类别,然后在SubList顶点找到它的值。

您可能已经注意到,这太复杂了。还有其他方法可以实现同样的目标吗?

1 个答案:

答案 0 :(得分:0)

如果这是你的情况:

create class Cat extends V
create property Cat.category string
create class CatEdge extends E

create class Val extends V
create property Val.value integer
create class ValEdge extends E

create vertex Cat set category = 'Education'
create vertex Cat set category = 'School'
create vertex Cat set category = 'College'
create vertex Cat set category = 'Bachelors'
create vertex Cat set category = 'Masters'

create vertex Val set value = 1
create vertex Val set value = 2
create vertex Val set value = 3

create edge CatEdge from (select from Cat where category = 'Education') to (select from Cat where category = 'School')
create edge CatEdge from (select from Cat where category = 'Education') to (select from Cat where category = 'College')
create edge CatEdge from (select from Cat where category = 'College') to (select from Cat where category = 'Bachelors')
create edge CatEdge from (select from Cat where category = 'College') to (select from Cat where category = 'Masters')

create edge ValEdge from (select from Cat where category = 'School') to (select from Val where value = 1)
create edge ValEdge from (select from Cat where category = 'Bachelors') to (select from Val where value = 2)
create edge ValEdge from (select from Cat where category = 'Masters') to (select from Val where value = 3)

enter image description here

如果我理解你的意图正确,这个查询将起作用:

select in("ValEdge").category, value from Val

输出: enter image description here


<强>更新

select category, $subcategories, $value from Cat
let 
$subcategories = ( select category  from (traverse out('CatEdge') from $parent.$current ) where $depth >=1 ),
$value = ( select out('ValEdge').value as value from $current )

返回this JSON

请注意,对于所有类别,或者您有子类别列表,或者,如果它是叶子,则为其值。