3

我有一个带有“日期”属性的“账单”顶点,并在账单日期上创建了一个自动 SB 树不是唯一索引,以便更快地搜索,现在我希望每张插入的账单都与下一张账单有边缘并创建一个链接节点结构,

到目前为止我得到的解决方案:

1-使用 gremlin 计算插入账单日期与其他账单日期之间的最小差异以获得最接近的账单,但它需要我扫描所有账单并且没有使用索引

2-我可以获取索引的键并使用Collections.binarySearch()并获取插入点的索引,从而获得相邻的账单,

但我想知道是否有其他更好的解决方案来链接账单,以及如何使用 SQL 在 OrientDB 索引中找到插入点,有什么想法吗?

4

1 回答 1

1

我用两个类的简单数据库尝试了你的例子:

  • 以属性 billDate 作为日期时间的 Bill(扩展 V);
  • nextBill(扩展 E)。

用这个查询

create vertex Bill set billDate=sysdate(), in_nextBill=(select @rid from Bill where billDate in (select max(billDate) from Bill))

您可以同时创建账单和之前提到的边。

已编辑

我创建了一个 Javascript 函数,它删除两条记录之间的边缘并在前两条记录之间插入一条新记录(具有相对边缘)。该函数接受三个输入参数: * date1 : datetime format; *日期2 :;datetime format* newBillDatedatetime format是您要在前两个之间插入的新账单日期;

var g=orient.getGraph();
var d1=g.command('sql','select from Bill where billDate in "'+date1+'"');
var d2=g.command('sql','select from Bill where billDate in "'+date2+'"');
var startDate=d1[0];
var endDate=d2[0];
if(endDate.getRecord().field("billDate").getTime()<startDate.getRecord().field("billDate").getTime()){
  var temp=endDate;
  endDate=startDate;
  startDate=temp;
}
var selectEdge=g.command('sql','select from nextBill where in='+endDate.getId()+' and out='+startDate.getId());
g.command('sql','delete edge '+selectEdge[0].getId());
var newIns=g.command('sql','create vertex Bill set billDate="'+newBillDate+'"');
g.commit();
g.command('sql','create edge nextBill from '+startDate.getRecord().getIdentity()+' to '+newIns.getRecord().getIdentity());
g.command('sql','create edge nextBill from '+newIns.getRecord().getIdentity()+' to '+endDate.getRecord().getIdentity());
于 2015-12-21T11:19:32.163 回答