2016-06-02 12 views
0

私は、このコマンドでのNeo4jのDB内のノードを作成しました:のNeo4j IN句の大文字と小文字を区別しない

CREATE (n:Person {Names: 'A', 'B', 'C'}) RETURN n; 
CREATE (n:Person {Names: 'D'}) RETURN n; 

は今、私は、人が特定のリスト内の名前の1持って取得するためにクエリを作りたいです。

私はこのリストがあります:[「A」、「C」]を - >それは第一人に

を返します。私はこのクエリのWHERE句で使用する必要があります知っているが、私はどのように知りませんそれを達成する。

私はNeo4j DBブラウザとNeo4jクライアント.Netにコマンドを書きたいと思います。

誰でも教えてください。

ありがとうございます。

答えて

1

1)ノードを追加するクエリが間違っています。それは次のようにする必要があります:

WITH ['a', 'D'] as Names 
MATCH (P:Person) 
WITH P, extract(name IN P.Names | LOWER(name)) as lowNames 
    WHERE ANY(n IN Names WHERE LOWER(n) IN lowNames) 
RETURN P 

更新:リストから少なくとも1つの値の出現を検索するには

CREATE (n:Person {Names: ['A', 'B', 'C']}) RETURN n; 
CREATE (n:Person {Names: ['D']}) RETURN n; 

2)、あなたは述語ANYを使用することができます。それは "グラフ"の精神でより良い方法であることを排除されていないモデルを変更することです。我々は名前が異なる人物で繰り返すことができると仮定した場合、それぞれの名前のためには、ノードを追加し、人との関係を追加する必要がある:

MERGE (P1:Person {id:'P1'}) 
MERGE (P2:Person {id:'P2'}) 
MERGE (P3:Person {id:'P3'}) 
MERGE (N1:Name {name:'A'}) 
MERGE (N2:Name {name:'B'}) 
MERGE (N3:Name {name:'C'}) 
MERGE (N4:Name {name:'D'}) 
MERGE (P1)-[:has_name]->(N1) 
MERGE (P1)-[:has_name]->(N2) 
MERGE (P1)-[:has_name]->(N3) 
MERGE (P2)-[:has_name]->(N4) 
MERGE (P3)-[:has_name]->(N1) 
MERGE (P1)-[:has_name]->(N4)` 

enter image description here

は、クエリを作成します

する人物を検索するクエリ:D:

// Find the desired names 
WITH ['a', 'D'] as Names 
WITH extract(name IN Names | LOWER(name)) as lowerNames 
MATCH (N:Name) WHERE LOWER(N.name) IN lowerNames 
// For each name, we find person 
WITH N 
    MATCH (P:Person)-[:has_name]->(N) 
RETURN collect(distinct P) 
+0

はそんなにありがとう – Redplane

関連する問題