orientDB - graph - 基于索引查找更新的节点

时间:2015-07-30 10:31:13

标签: sql graph clojure orientdb nosql

我有一个带有根节点的图形结构,几个容器节点(我称之为lvl1),每个节点包含数十万个内容节点(lvl2)。内容节点可以与任意数量的其他内容节点链接。 Lvl1节点永远不会相互链接并只链接到它们的lvl2节点一次。构建图形时,lvl2节点之间的链接可能会多次出现,在这种情况下,我需要保持链接的计数(在适当的边缘上增加depth属性)。施工顺序也是随机的。

我正在寻找一种使用orientDB管理该图结构的有效方法。建立它是有点,问题是更新lvl2节点(添加更多链接)和它们之间的链接。

选择的一种方法可能是标准的SQL查询,比如SELECT FROM lvl2nodes WHERE id = 114 - 但是这会查询整个数据集并且非常慢,据我所知(我没有测试过尚未)。

所以我的想法是使用索引查找。我创建了自动建立索引CREATE INDEX lvl2node.id UNIQUE并尝试查询:SELECT FROM INDEX:lvl2node.id WHERE key = 114,它为我提供了一个元组({:key 114, :rid #<ODocument lvl2node#8:1{id:114,in:[2],out:[1]} v1>})

现在,我怎么能

a)使用该信息选择节点并更新其属性和

b)找到2个这样的顶点之间的边缘以类似地执行更新

或者有更好的方法来更新图表&#39;顶点,利用图形结构? lvl1节点仍然包含很多链接,需要在没有哈希映射的方法的情况下遍历。

我使用Clojure的clj-orient API来访问orientDB。

1 个答案:

答案 0 :(得分:1)

orientdb wiki中所述:

[...] "When you've millions of records indexes show their limitation 
because the cost to find the records is O(logN). This is also the main 
reason why Relational DBMS are so slow with huge database.

So when you've millions of record the best way to scale up linearly 
is  avoid using indexes at all or as much as you can. But how to  
retrieve records in short time without indexes? Should OrientDB scan 
the entire database at every query? No. You should use the Graph 
properties of OrientDB."

我会像使用时间序列用例一样使用树的链接映射。

它看起来像这样:

create class lvl1
create class lvl2
create class lvl3

create property lvl1.id integer
create property lvl1.lvl2 linkmap lvl2
create property lvl2.lvl3 linkmap lvl3

linkmap中的键将是下一级节点ID。要获得深度,可以使用下一级链接图属性的length属性。