2016-06-29 7 views
0

Ich habe eine Baumstruktur, bei der jede Beziehung einen Beziehungstyp "links" oder "rechts" zum nächsten Knoten haben kann. Die Knoten sind alle vom selben Typ, mit Ausnahme des Endknotens.Cypher: Tiefensuche zuerst nach Pfaden nach Beziehungstyp

Wie würde ich die Pfade sortieren, damit ich sie in die Tiefe bringe - zuerst Suche, die immer die linken Beziehungen zuerst nimmt? Ich weiß, dass ich die Pfade ziehen kann und wahrscheinlich das in meinem eigenen Code mache. Aber gibt es einen Weg, es mit Cypher zu machen?

So etwas wie: match path = (n) - [r *] -> (n: Terminal), um durch lefts ersten Rückpfad

enter image description here

Antwort

0

ich anscheinend einen Weg gefunden zu haben, eine Kombination mit reduzieren und extrahieren. Ich bin mir nicht sicher, ob dies der effizienteste Weg ist, aber es funktioniert.

Zuerst erstellen Sie 2 Informationen für jede Beziehung im Pfad und kombinieren sie zu einer Zeichenfolge.

  1. Index der Beziehung im Weg
  2. Dann einen Fall Anweisung I ‚1‘ für links wählen, ‚2‘ für rechts

Zweitens jede Beziehung String kombiniert mit reduzieren in eine langer String für alle Beziehungen im Pfad, um so etwas wie 011121 für den ersten Pfad zu erhalten. Sortiere diese Reihenfolge der Strings zuerst nach der Tiefe, da sie effektiv nach Level und dann nach links/rechts sortiert wird.

match 
    p=(n)-[r*]->(terminal_node) 
    where n.id = 'root node id' 
with 
    p, 
    terminal_node, 
    extract(
     r IN relationships(p) | 
     REDUCE(
      c=-1, 
      indx in range(0, size(relationships(p))-1) | 
      case when relationships(p)[indx] = r then indx else c end 
     ) + case when type(r) = 'LEFT' then '1' else '2' end 
    ) as rel_index_and_order 
return 
    p, 
    terminal_node, 
    REDUCE(s='', r in rel_index_and_order | s+r) as path_sort 
order by path_sort