2017-03-19 4 views
1

Comment créer des relations entre des nœuds uniquement lorsque des relations spécifiques spécifiées par un modèle n'existent pas déjà?Neo4j recherche générique sur les relations existantes?

Le plus proche que je peux obtenir est:

MATCH (d1:Document),(d2:Document), (d1)-[r]-() 
WHERE d1.acct = d2.acct 
AND d1.doc_type = 'ID' AND d2.doc_type = 'PA' 
AND d1.DD_sd = d2.DD_sd 
AND NOT TYPE (r) =~ ':IDRelated*.' 
CREATE (d1) -[:IDRelated_SameDD]-> (d2) 

mais ce ne serait pas aussi précis que énumérant les relations spécifiques à exclure.

Je voudrais quelque chose comme:

MATCH (d1:Document),(d2:Document) 
WHERE d1.acct = d2.acct 
AND d1.doc_type = 'ID' AND d2.doc_type = 'PA' 
AND d1.DD_sd = d2.DD_sd 
AND NOT ((d1) -[':IDRelated*.']-()) 
CREATE (d1) -[:IDRelated_SameDD]-> (d2) 

où je peux utiliser une expression régulière (ou COMMENCE AVEC) pour spécifier un motif à exclure plusieurs relations correspondant à ce modèle.

Merci!

Répondre

3

Pour le moment, il n'y a pas de telle façon de faire cela en ligne dans un motif.

Toutefois, vous pouvez PROFILER votre requête et la comparer à une requête où vous enregistrez votre correspondance à d2 jusqu'à ce que vous ayez terminé le filtrage pour les correspondances d1 correctes. Quelque chose comme ceci:

MATCH (d1:Document)-[r]-() 
WHERE d1.doc_type = 'ID' 
WITH d1, COLLECT(r) as rels 
WHERE NONE(r in rels WHERE type(r) STARTS WITH 'IDRelated') 
MATCH (d2:Document) 
WHERE d1.acct = d2.acct 
AND d1.DD_sd = d2.DD_sd 
AND d2.doc_type = 'PA' 
CREATE (d1) -[:IDRelated_SameDD]-> (d2) 
+1

ou plutôt 'type (r) COMMENCE AVEC IDRelated' –

+0

Oups, vous avez raison! – InverseFalcon