2017-04-18 71 views
1

我無法對頂點(或邊)的嵌入列表屬性執行通配符查詢。OrientDB嵌入式列表(字符串):通配符查詢

例如: 假設我們有一個Person類名爲Nicknames多值屬性和它的一個實例:

{ 
     "@type": "d", 
     "@rid": "#317:0", 
     "@version": 1, 
     "@class": "Person", 
     "Nicknames": [ 
      "zito", 
      "ziton", 
      "zitoni" 
     ] 
    } 

然後, Select FROM Person WHERE Nicknames like "zit%" 返回空的結果集,而:

Select FROM Person WHERE Nicknames ="zito"正確返回1項。

有一個NOTUNIQUE_HASH_INDEX索引Nicknames該字段。

我已經嘗試過很多辦法(包含,指數查詢...),沒有運氣:(

我可能失去了一些東西基本

+0

你使用的是什麼版本? – gaber84

+0

2.2.17版。 – Niro

回答

0

你可以試試這個:

select from Person where Nicknames containstext 'zit' 

希望幫助

+0

'''containstext'''很好,但它不允許我使用通配符,這是我需要的重要特性(開始時,結束時......) – Niro

+0

@Niro您可以嘗試使用lucene索引,但是有一點限制 – AVK

1

我知道是不是我會寫,但留下來套牢你的「使用通配符查詢」需求的理想解決方案,這是隻爲我工作的,作爲AV方式ķ說是一個Lucene索引一個更好的主意工作,但與標準的落實我無法讓它正常工作,現在我在這裏做了什麼:

使用Studio來創建一個javascript函數2參數名稱爲「陣」和‘規則’,讓命名功能‘wildcardSearch’

過去這段代碼的函數體(就是簡單的JavaScript改變它,如果它dosent做的工作):

for(i=0; i<array.length ; i++){ 
     rule= rule.split("*").join(".*"); 
     rule= rule.split("*").join(".*"); 
     rule= "^" + ruleValue + "$"; 
     var regex = new RegExp(rule); 
     if (regex.test(array[i])) 
     return true; 
    } 
return false; 

記住節省費用

現在你可以ñ查詢:

Select from Person where wildcardSearch(nicknames,'zit*')=true 

注意事項:是一種蠻力方法,但展示瞭如何「逗」,可以玩弄於OrientDb的「存儲過程」,所以我決定無論如何要分享,如果性能是你的主要目標這個東西不適合你,它掃描所有的類,並在數組上執行循環來應用正則表達式。索引是一種更好的解決方案,或者使用不同的數據結構來更改數據庫。

+0

如果沒有其他選項會被建議(可能是項目的貢獻者......),我會使用這個方向。謝謝 – Niro