2017-12-19 21 views
1

neo4jを使用して、ラベルのうちの1つを持つノード(PersonおよびOrganization)のデータを保存しています。すべてのノードにはプロパティがあります。nameフィルタリングのためのneo4j cypherクエリ

すべての関係には、LinkedToというラベルが付けられ、プロパティはscoreです。

MATCH (n:Person) WHERE n.name =~ "(?i)person1" 
MATCH (m:Organization) WHERE m.name =~ "(?i)organization1" 
WITH m,n 
MATCH p = (m)-[*1..4]-(n) 
RETURN p ORDER BY length(p) LIMIT 10 

これは今

(10件まで)すべてのパスを返します。私のようなこれらのノード間の経路を検索するパスのクエリを使用している

Personの1組とOrganizationノード間の複数の関係があるかもしれません特定のパスを見つけたいと思っています。すべての関係にはscore=1が含まれています。これを達成する方法がわからない、私はMATCH p = (m)-[f*1..4]-(n)で始まったが、廃止の警告が出た。だから、いくつかのグーグルと試行錯誤の後、私はこの思い付いた:

MATCH (n:Person) WHERE n.name =~ "(?i)person1" 
MATCH (m:Organization) WHERE m.name =~ "(?i)organization1" 
WITH m,n 
MATCH p = (m)-[*1..4]-(n) 
WITH filter(x IN relationships(p) WHERE x.score=1) AS f 
ORDER BY length(p) 
UNWIND f AS ff 
MATCH (a)-[ff]-(b) 
RETURN a,b,ff LIMIT 10 

しかし、これは正しく、きれいではないではなく、私のパスに必要とされていない関係とノードを与えています。

これは基本的なサイファークエリかもしれませんが、私は初心者にすぎず、この点で助けが必要です。 :)私はこのクエリを検索している理解して何から

答えて

1

MATCH p = (m:Organization)-[rels*1..4]-(n:Person) 
WHERE 
    n.name =~ "(?i)person1" AND 
    m.name =~ "(?i)organization1" AND 
    all(r IN rels WHERE r.score=1) 
RETURN p 
ORDER BY length(p) 

によりall(r IN rels WHERE r.score=1)に、のNeo4jはちょうど1に属性scoreセットを持っているパス内の関係を拡大していきます。

また、ノードn & mの正規表現条件を使用していることに注意してください。この演算子はインデックスを使用できません。 あなたの目標は、大文字と小文字を区別しない検索を持っているのであれば、私は小文字に名前を保存するために、としたことCONTAINSまたはSTARTS WITH

+0

ありがとうとあなたの正規表現を置き換えるためにサニタイズフィールド(EX _name)を作成するようアドバイスしていまさに私が探していたもの! :) –

+0

あなたはまた、答えを受け入れることができます:(グラフで楽しくてください! – logisima

+0

私は、それはそれを登録していないと思います! –

関連する問題