2017-10-09 1 views
1

Je souhaite insérer des données basées sur d'autres lebel/collection. J'ai 2 lebel/collection (unité, utilisateur) et ils ont 1 relation (Business) entre eux, Et je veux insérer des données dans unit en fonction de leur relation. Ma requête Cypher est donnée ci-dessous:Insérer les données en fonction de la condition Where dans Neo4j

MATCH (u:Units)<-[:Business]-(s:Users) 
WHERE s.id = 'some-user-id' 

WITH count(u) as numOfUnit 

// return number of units connected with user 
// if numOfUnit is smaller then 2 
// insert/merge new data into Units lebel/collection 
// with relation between them 

MERGE (bu:Units {name:'some-name-01', info:'some-info-01' }) 
WHERE numOfUnit < 2 
ON CREATE SET 
    bu.id = '${uuid()}', 
    bu.created = '${moment().toISOString()}' 
ON MATCH SET 
    bu.updated = '${moment().toISOString()}' 

WITH bu as bu 

MATCH (bs:Users {id: 'some-user-id' }) 
MERGE (bs)-[r:Business]-(bu) 

RETURN properties(bu) 

Après l'exécution ci-dessus requête, il démontré l'erreur suivante:

{ Neo4jError: Invalid input 'H': expected 'i/I' (line 10, column 18 
    (offset: 377)) 
     "  ON CREATE SET" 
     ^
      at Neo4jError.Error (native) 
      at new Neo4jError (../../../../node_modules/neo4j-driver/lib/v1/error.js:76:132) 
      at newError (../../../../node_modules/neo4j-driver/lib/v1/error.js:66:10) 
      at Connection._handleMessage (../../../../node_modules/neo4j-driver/lib/v1/internal/connector.js:355:56) 
      at Dechunker.Connection._dechunker.onmessage (../../../../node_modules/neo4j-driver/lib/v1/internal/connector.js:286:12) 
      at Dechunker._onHeader (../../../../node_modules/neo4j-driver/lib/v1/internal/chunking.js:246:14) 
      at Dechunker.AWAITING_CHUNK (../../../../node_modules/neo4j-driver/lib/v1/internal/chunking.js:199:21) 
      at Dechunker.write (../../../../node_modules/neo4j-driver/lib/v1/internal/chunking.js:257:28) 
      at NodeChannel.self._ch.onmessage (../../../../node_modules/neo4j-driver/lib/v1/internal/connector.js:259:27) 
      at TLSSocket.<anonymous> (../../../../node_modules/neo4j-driver/lib/v1/internal/ch-node.js:308:16) 
     code: 'Neo.ClientError.Statement.SyntaxError', 
     name: 'Neo4jError' } 
+1

La requête ne compile pas, car 'WHERE numOfUnit <2' doit précéder' MERGE'. –

Répondre

2

Les documents sur WHERE article dit:

WHERE adds constraints to the patterns in a MATCH or OPTIONAL MATCH clause or filters the results of a WITH clause.

C'est: WHERE ne peut pas être utilisé conjointement avec MERGE.

Comme indiqué dans les commentaires, votre requête doit travailler la condition de mettre WHERE après la clause WITH, parce que vous pouvez utiliser WHERE pour filtrer les résultats d'un WITH.

MATCH (u:Units)<-[:Business]-(s:Users) 
WHERE s.id = 'some-user-id' 

WITH count(u) as numOfUnit 
WHERE numOfUnit < 2 

MERGE (bu:Units {name:'some-name-01', info:'some-info-01' }) 
ON CREATE SET 
    bu.id = '${uuid()}', 
    bu.created = '${moment().toISOString()}' 
ON MATCH SET 
    bu.updated = '${moment().toISOString()}' 

WITH bu as bu 

MATCH (bs:Users {id: 'some-user-id' }) 
MERGE (bs)-[r:Business]-(bu) 

RETURN properties(bu)