J'essaie de créer des arêtes entre des nœuds qui partagent des propriétés dans neo4j. Chaque noeud a 5 propriétés, disons a, b, c, d, e. Si 2 nœuds partagent uniquement la propriété 'a', alors le bord aura le nom 'a'. Si 2 nœuds partagent les propriétés b, d, e, alors le nom de bord sera 'bde'. Pour chaque paire, si elles partagent des propriétés, je veux créer un seul bord. Merci.Comment créer un bord conditionnel entre les nœuds dans neo4j?
Répondre
Cette requête devrait créer une relation FOO
avec le name
d'une propriété qui a la même valeur entre chaque paire de noeuds (qui partagent les valeurs de propriété):
MATCH (m), (n)
WHERE ID(m) < ID(n)
WITH m, n, [x IN KEYS(m) WHERE m[x] = n[x] | x] AS common_keys
FOREACH (k IN common_keys | CREATE (m)-[:FOO {name: k}]->(m))
La clause WHERE ID(m) < ID(n)
empêche m
et n
de étant le même noeud, et empêche également l'évaluation en double de la même paire.
[UPDATE]
Si vous voulez une seule relation FOO
entre 2 nœuds, même si elles partagent des valeurs de propriété multiples, cette requête devrait fonctionner:
MATCH (m), (n)
WHERE ID(m) < ID(n)
WITH m, n,
REDUCE(s = '', k IN KEYS(m) | CASE m[k] WHEN n[k] THEN s + k ELSE s END) AS common_keys
WHERE common_keys <> ''
CREATE (m)-[:FOO {name: common_keys}]->(m)
Merci. Votre requête crée plusieurs bords. J'ai donc fait un changement pour créer un seul bord avec des noms comme 'ade'. – Neo
Merci pour la mise à jour @ cybersam. Existe-t-il un moyen plus efficace pour un grand ensemble de données. Merci! – Neo
Cette requête produit un produit cartésien et la taille de mes données est très grande (~ 1million). existe-t-il un moyen plus efficace de créer des bords. Merci! – Neo
Il y a quelques informations qui pourraient aider à répondre à votre question. 1. Par le nom du bord, voulez-vous dire le 'type' du bord? 2. Si oui, pouvez-vous utiliser la [bibliothèque APOC] (https://neo4j-contrib.github.io/neo4j-apoc-procedures/)? –