2017-02-21 1 views
0

graph snippetcypher - Beziehung Traversal vs Bestellung nach Eigenschaft

Ich habe eine Form mit einer Liste von Punkten.

Ich habe folgende Anforderungen:

1) abrufen einen geordneten Satzes von Punkten;

2) einfügen/einen Punkt entfernen und die Reihenfolge der übrigen Punkte erhalten

ich dies erreichen kann:

A) Punkt hat eine Sequenz Integer-Eigenschaft, die verwendet werden könnte, um Auftrag;

B) Fügen Sie eine: NEXT-Beziehung zwischen den einzelnen Punkten hinzu, um eine verknüpfte Liste zu erstellen.

Ich bin neu bei Neo4j, also nicht sicher welcher Ansatz vorzuziehen ist, um die Anforderungen zu erfüllen?

Für die erste Anforderung, schrieb ich die folgenden Abfragen und die Leistung für die Traversal gefunden, schlecht zu sein, aber ich bin sicher, es ist eine schlecht konstruierte Abfrage:

//A) 146 ms 
Match (s:Shape {id: "1-700-y11-1.1.I"})-[:POINTS]->(p:Point) 
return p 
order by p.sequence; 

//B) Timeout! Bad query I know, but dont know the right way to go about it! 
Match path=(s:Shape {id: "1-700-y11-1.1.I"})-[:POINTS]->(p1:Point)-[:NEXT*]->(p2:Point) 
return collect(p1, p2); 

Antwort

2

Um eine leicht modifizierte zu erhalten geordnete Liste von Punkten verwenden Version der zweiten Abfrage:

Match path=(s:Shape {id: "1-700-y11-1.1.I"})-[:POINTS]->(P1:Point) 
              -[:NEXT*]-> (P2:Point) 
     WHERE NOT (:Point)-[:NEXT]->(P1) AND 
       NOT (P2)-[:NEXT]->(:Point) 
RETURN TAIL(NODES(path)) 

Und zum Beispiel Abfrage löschen:

WITH "id" as pointToDelete 
MATCH (P:Point {id: pointToDelete}) 
OPTIONAL MATCH (Prev:Point)-[:NEXT]->(P) 
OPTIONAL MATCH (P)-[:NEXT]->(Next:Point) 
FOREACH (x in CASE WHEN Prev IS NOT NULL THEN [1] ELSE [] END | 
    MERGE (Prev)-[:NEXT]->(Next) 
) 
DETACH DELETE P 
Verwandte Themen