2017-04-18 21 views
1

頂点(またはエッジ)の埋め込みリストプロパティでワイルドカードクエリを実行できません。例えばOrientDB埋め込みリスト(文字列):ワイルドカードクエリ

: 我々はNicknamesとの1つのインスタンスという名前の多値プロパティでPersonクラスがあると:

{ 
     "@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個の商品を返します。

フィールドNicknamesNOTUNIQUE_HASH_INDEXのインデックスがあります。

私は運で(含まれ、インデックスクエリ...)多くの方法を試してみた:(

を私はおそらく基本的な何かが欠けている

+0

どのバージョンをお使いですか? – gaber84

+0

バージョン2.2.17。 – Niro

答えて

0

をあなたがこの試すことができます。

select from Person where Nicknames containstext 'zit' 

私が知っている

+0

'' 'containstext'''はいいですが、私の必要性のために重要な機能であるワイルドカードを使用させることはできません。 – Niro

+0

@Niro代わりにluceneインデックスを使ってみることもできますが、それは少し制限されています – AVK

1

に役立ちます希望は、これはAVとして、私のために働いていた唯一の方法である私が書くことではなく、「ワイルドカードでクエリー」のあなたの条件で立ち往生滞在するつもりです何を理想的なソリューションではありませんKは述べていますが、Luceneのインデックスではより良いアイデアですが、標準の実装では動作させることができませんでした。ここで私は何をしましたか:

スタジオを使用して、配列」と 『ルール』、機能に名前を付けることができます 『関数の本体には、このコードを過ぎて』 wildcardSearch

を(それが仕事をするdosent場合だけのシンプルなjavascriptのは、それを変更された):

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; 

覚えておいてください機能を保存するには

n個のクエリ:

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

考慮事項:パフォーマンスがある場合は、強引な方法ですが、私はとにかくそれを共有することを決定しましたのでOrientDbの「ストアドプロシージャ」で遊ぶことができますどのように「面白い」と表示します主な目標は、あなたのためではない、それはすべてのクラスをスキャンし、正規表現を適用する配列のループを行います。インデックスは、より良い解決策です。あるいは、異なるデータ構造でDBを変更してください。

+0

他のオプションが(おそらくプロジェクトの貢献者によって...)提案されない場合、私はこの方向を使用します。ありがとう – Niro

関連する問題