2017-02-21 38 views
0

graph snippet密码 - 关系遍历与按属性排序

我有一个Shape列表的点。

我有以下要求:

1)检索一组有序的点;

2)插入/取出点并保留点的其余部分的次序

我可以实现这一点:

A)点有可能被用于一个序列整数属性订购;

B)在每个Point之间添加一个:NEXT关系来创建一个链表。

我是Neo4j的新手,不确定哪种方法更适合满足要求?

对于第一个要求,我写了下面的查询,并找到了遍历的性能要差,但我敢肯定它的构造不正确的查询:

//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); 

回答

2

拿分的有序列表使用稍微修改第二个查询的版本:

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)) 

再举例来说,查询,删除:

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