2015-12-20 117 views
3

我有一個'帳單'頂點與'日期'屬性和自動SB樹不是唯一的索引在帳單的日期更快的搜索,現在我想每個插入的票據與下一個邊緣法案並創建一個鏈接節點結構,OrientDB,查找索引插入點

我走到這一步的解決方案:

1使用小鬼來計算所投入的紙幣的日期和所有其他法案獲得最接近的法案之間的差異很小,但它要求我掃描所有的賬單,並沒有使用索引

2-我可以得到索引的鍵和使用Collections.binarySearch()並得到插入點的索引,因此得到相鄰的賬單,

但我不知道有沒有其他更好的解決方案有鏈接賬單,我怎麼能找到插入點在OrientDB索引使用SQL,任何想法?

回答

1

我想你的例子有兩個類的簡單DB:

  • 比爾(延伸V)與物業billDate的日期時間;
  • nextBill(擴展E)。

與此查詢

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

,你可以在同一時間創造法案和邊緣提到了以前。

EDITED

我創建了一個Javascript函數,去除兩個記錄之間的邊緣和前兩者之間插入一個新的記錄(相對邊緣)。 該功能接受三個輸入參數: * date1datetime format; * date2datetime 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()); 
+0

感謝@LucaS的答案,但如果我想插入2張紙幣間的新法案是什麼,可以說今天是星期二,新法案將不會有'SYSDATE()',而這將有13個: 00星期日下午 – DrAhmedJava

+0

嗨,你想在2個預定義日期之間插入新賬單嗎? – LucaS

+0

是的,這正是我想要的,問題是搜索時間這一點隨着數據庫中賬單增加而增加,我知道這將涉及改變之前,當前和下一個賬單之間的邊界,但是一旦我得到正確的插入點 – DrAhmedJava