我是OrientDB的初学者。
考虑我有2个顶点,Cat
和Val
Cat
包含名为category
的属性,Val
包含名为value
的属性。
类别可以包含子类别,也可以包含子类别等。类别和子类别存储在顶点Cat
中。使用名为CatEdge
的边来映射子类别,from
和to
是相同的顶点,即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
顶点找到它的值。
您可能已经注意到,这太复杂了。还有其他方法可以实现同样的目标吗?
答案 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)
如果我理解你的意图正确,这个查询将起作用:
select in("ValEdge").category, value from Val
输出:
<强>更新强>
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。
请注意,对于所有类别,或者您有子类别列表,或者,如果它是叶子,则为其值。