2016-06-02 8 views
0

habe ich einen Knoten in Neo4j db mit diesem Befehl:Neo4j IN-Klausel Groß- und Kleinschreibung

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

Nun möchte ich eine Abfrage, um eine Person in einer bestimmten Liste einen der Namen hat abzurufen.

Ich habe diese Liste: [ ‚a‘, ‚c‘] -> Es wird die erste Person zurückkehren

Ich weiß, ich habe für diese Abfrage verwenden IN-Klausel, aber ich weiß nicht, wie man es erreichen.

Ich möchte den Befehl in Neo4j DB Browser und Neo4j Client .Net schreiben.

Kann mir bitte jemand helfen?

Vielen Dank.

Antwort

1

1) Sie haben eine falsche Abfrage zum Hinzufügen von Knoten. Es sollte so aussehen:

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

2) Um das Auftreten von mindestens einem Wert aus der Liste zu suchen, können Sie das Prädikat ANY verwenden:

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 

aktualisieren. Es ist nicht ausgeschlossen, dass es besser im Sinne von "Graph" ist, das Modell zu ändern. Wenn wir, dass die Namen annehmen können mit verschiedenen Personen wiederholt werden, dann für jeden Namen ist es notwendig, einen Knoten, hinzuzufügen und eine Beziehung zu der Person hinzufügen:

enter image description here

Abfrage erstellen:

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)` 

Und eine Abfrage Personen suchen:

// 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

Thank you so viel: D – Redplane