J'ai essayé de supprimer une relation, et cette erreur peu documentée apparaît.

La requête:

MATCH ()-[r:SendTo]-(n:Wallet)
WHERE NOT ()-[:BelongTo]->(n)
DELETE r
RETURN r

La sortie d'erreur entière:

Exception in thread "main" org.neo4j.driver.v1.exceptions.value.NotMultiValued: NULL is not a keyed collection
at org.neo4j.driver.internal.value.ValueAdapter.get(ValueAdapter.java:192)
at basicANeo4j.Importer.<init>(Importer.java:213)
at basicANeo4j.Importer.main(Importer.java:246)

Lorsque j'ai vérifié la relation correspondante, il n'y a aucune propriété de celle-ci qui est nulle:

<id>:595 value_bitcoin:20000000000outputIndex:defaultuniqueReferenceTran:bcaeee45968b5a08c88ed7a0d90a1275728eda356013465408197e9f77c634daNULLtranHashString:bcaeee45968b5a08c88ed7a0d90a1275728eda356013465408197e9f77c634datime:2016-01-01T22:55:26type:pubkeyhashvalue_dollar:86554.0estChanAddr:3KgtbGgaX2ngstNpvyv7LwpHSweVeqGbpM

J'ai regardé dans ValueAdapter.class, voici le code pertinent:

@Override
public Value get( String key )
{
    throw new NotMultiValued( type().name() + " is not a keyed collection" );
}

Sans aucune documentation, cela n'aide pas du tout.

0
Aqqqq 20 avril 2017 à 07:53

3 réponses

Meilleure réponse

Je viens de réaliser d'où vient l'erreur de collection à clé: en parcourant les enregistrements, j'ai essayé d'imprimer une propriété de la relation, alors que la propriété n'existe pas pour cette relation. (Je l'ai copié à partir d'une autre partie de mon code sans le vérifier et j'étais convaincu que c'est la requête qui est le problème. J'ai donc manqué cela.)

0
Aqqqq 20 avril 2017 à 07:26

Je pense que c'est parce que vous essayez de renvoyer un objet nul parce que vous l'avez supprimé en premier. J'essaierais ça

MATCH ()-[r:SendTo]-(n:Wallet)
WHERE NOT ()-[:BelongTo]->(n)
DELETE r
RETURN 'success'

Vous pouvez renvoyer une chaîne, renvoyer n si vous êtes intéressé par le portefeuille dont les relations ont été supprimées ou vous ne pouvez rien renvoyer.

1
Tomaž Bratanič 20 avril 2017 à 06:19

Comme le dit Tomaz, c'est parce que vous ne pouvez pas renvoyer un nœud ou une relation que vous venez de supprimer.

Cependant, vous pouvez obtenir un "instantané" de carte d'un nœud ou d'une relation, supprimer le nœud ou la relation, puis renvoyer l'instantané.

Voici l'article dans la base de connaissances.

2
InverseFalcon 20 avril 2017 à 06:26