2017-03-29 14 views
0

特定のラベルのノードを展開して検索したい。しかし、私はまた、特定のラベルを持つパスのノードをフィルタリングしたい。 ラベル列が「エンティティ;人」のような値が含まれている「エンティティ;組織」、私はフィルタは、すべてのノード上で、これまでArangoDB:プロパティを検索し、パス内の複数の値をフィルターに掛ける

LET source = (FOR x IN Entity FILTER x.objectID == @nodeId 
    Return x)[0] 
FOR node, edge, path IN [email protected] ANY source GRAPH @graph 
     FILTER CONTAINS(node.label, @search) 
     AND node != source 
     AND (CONTAINS (path.vertices[*].label, "Person") OR CONTAINS (path.vertices[*].label, "Organization") OR CONTAINS (path.vertices[*].label, "Incident")) 
     LIMIT @maxPaths 
     RETURN {node,path} 

問題

  1. を持っている何

    パス。私はソースと宛先なしでパス上でフィルタリングしたいと思います。

  2. 入っている部分は本当に醜いです。複数の値をフィルタリングするより良い方法はありますか?

答えて

1

1)path.vertices[* LIMIT 1,LENGTH(path.vertices)-2]では、頂点配列の最初の(ソース)エントリと最後の(宛先)エントリは無視されます。

2)サブクエリで検索したラベルを繰り返し処理し、パスの頂点にラベルが存在するかどうかを確認できます。 1つ見つけたらLIMIT 1 RETURN 1でサブクエリを終了すると、長さ1の配列が返されます。さもなければ、長さ0の配列が得られます。

LET labels = ["Person","Organization","Incident"] 

FOR source IN Entity FILTER source.objectID == @nodeId 
LIMIT 1 
FOR node, edge, path IN [email protected] ANY source GRAPH @graph 
    FILTER CONTAINS(node.label, @search) 
    AND node != source 
    AND LENGTH(FOR i IN labels 
    FILTER CONTAINS(path.vertices[* LIMIT 1,LENGTH(path.vertices)-2].label, i) 
    LIMIT 1 
    RETURN 1) == 1 
    LIMIT @maxPaths 
    RETURN {node,path} 

ノード:私はバインドパラメータとしてlabelsを使用します。したがって、クエリを変更せずにラベルロジックを拡張することができます。

関連する問題