2016-10-25 1 views
4

J'essaie d'insérer un tableau d'objets en tant que propriété au noeud. J'ai essayéInsérer un tableau d'objets en tant que propriété dans neo4j

MERGE (ss:Label1 {sId: 12345}) 
    ON MATCH SET ss.id = 14770746012, ss.setC = 1,ss.nl = [{id: 24, status: 0}] 
    ON CREATE SET ss.id = 14770746012, ss.setC = 1,ss.nl = [{id: 24, status: 0}] 

Si REALISER J'obtiens l'erreur follwing ::

Property values can only be of primitive types or arrays thereof 

Que même j'ai essayé avec tableau imbriqué, qui m'a donné la même erreur que ci-dessus.

j'ai étudié dans la documentation Neo4j que Neo4j ne peut pas soutenir

« Nesting des valeurs de propriété »

Comment réaliser mon exigence?

Répondre

3

Comme Neo4j prennent pas en charge les propriétés hiérarchiques, l'une des façons de résoudre ce problème - pour créer des nœuds supplémentaires:

MERGE (ss:Label1 {sId: 12345, id: 14770746012, setC: 1 }) 
MERGE (nl:Props:nlProp {id: 24, status: 0}) 
MERGE (ss)-[:hasProps]->(nl) 
2

Comme mentionné par stdob--, vous pouvez créer des noeuds supplémentaires si votre besoin d'utiliser les propriétés dans les requêtes (pour le filtrage, l'agrégation, etc.).

Cependant, si vous voulez juste lire et écrire les données, mais pas agir sur elle dans les requêtes, vous pouvez sérialiser, par exemple comme JSON:

MERGE (ss:Label1 {sId: 12345}) 
    ON MATCH SET ss.id = 14770746012, ss.setC = 1,ss.nl = ["{\"id\": 24, \"status\": 0}"] 
    ON CREATE SET ss.id = 14770746012, ss.setC = 1,ss.nl = ["{\"id\": 24, \"status\": 0}"] 
+1

La procédure [APOC] (https://neo4j-contrib.github.io/neo4j-apoc-procedures/) 'apoc.convert.toJson' peut être utilisée pour effectuer la sérialisation JSON. – cybersam

0

Une autre option est de diviser la collection nl dans une collection séparée pour chaque propriété d'élément. Par exemple:

MERGE (ss:Label1 {sId: 12345}) 
SET ss.id = 14770746012, ss.setC = 1, ss.nl_ids = [24], ss.nl_statuses: [0]; 

correspondant nl_ids et nl_statuses valeurs ont le même indice.

En plus: depuis votre ON MATCH SET ... et ON CREATE SET ... actions sont exactement les mêmes, je les simplement combinés en une seule clause SET ....