3

中執行查詢lazily在當前的項目中,我們需要找到幾乎完全連通的圖中最便宜的路徑,其中每個頂點對可以包含大量的邊。在Orient-DB

我們開發a plugin含有功能

  1. 特殊遍歷該圖表,以降低的類似路徑reoccurences而TRAVERSE執行。我們將其稱爲search()
  2. ,用於從這些遍歷的結果中特別有效地提取期望的信息。我們將其稱爲extract()
  3. 用於根據目標參數提取最好的N記錄而無昂貴的ORDER BY。我們將其稱爲best()

但是結果查詢在完整數據上仍然不能令人滿意。

因此,我們決定修改search()函數,以便它可以首先觀察最佳邊緣,並通過使用當前狀態best()函數修剪導致肯定不期望的結果的路徑。
整體解決方案實際上是一個靈活地實現Branch and Bound method

結果查詢(省略extract()步驟)應該像

SELECT best(path, <limit>) FROM (
    TRAVERSE search(<params>) FROM #<starting_point> 
    WHILE <conditions on intermediate vertixes> 
) WHERE <conditions on result elements> 

這種形式是非常需要的,所以我們可以爲我們的當前任務適應WHILEWHERE下條件。 path字段由search()生成,其中包含best()的所有信息以繼續。

麻煩的是,best()功能被執行後嚴格search()功能,所以search()不能根據已經由best()評價結果修剪非最佳分支。

所以現在的問題是:
有沒有辦法從TRAVERSE一步一步SELECT的方式,舊的路徑是TRAVERSE d與search()稍早通過的路徑與SELECT處理best()管道的結果嗎?

+0

對它們進行檢索.1.6? – Lvca

+0

@Lvca我認爲它是2.1.0社區 – Odomontois

回答

2

在這種情況下的查詢執行將被流式傳輸。如果添加

System.out.println() 

,或者你把你的功能,斷點,你會看到,調用順序將是

search 
best 
search 
best 
search 
... 

你可以使用一個ThreadLocal對象http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html

存放一些上下文數據並在兩個函數之間共享它,或者您可以使用OCommandContext(OSQLFunction.execute()方法中的最後一個參數來存儲上下文信息)

您可以使用context.getVariable()context.setVariable()

兩個查詢(父和內部查詢)的背景是不同的,但他們應該由父/子關係聯繫起來,所以你應該能夠在您使用V2使用OCommandContext.getParent()

+0

這是一個很大的老麻煩,但'iContext'似乎在遍歷函數(稱爲'search')內是'null'。但它似乎在非常簡單的測試功能上工作,並未在目標測試功能上確認。 問題被創建是因爲我錯誤地保證'TRAVERSE'和'SELECT'具有類似的行爲。而在鏈接'SELECT'中,這種流式傳輸絕對不會發生。 如果上下文爲空,我會在幾天內驗證流式並獎勵賞金,然後 – Odomontois

+0

是一個錯誤。你可以試試2.1.6嗎? – Lvca