Neo4j cypher-关系遍历与按属性排序
我有一个带有点列表的形状 我有以下要求: 1) 检索一组有序的点 2) 插入/删除点并保留其余点的顺序 我可以通过以下方式实现这一目标: A) 点具有可用于排序的序列整数属性 B) 在每个点之间添加:下一个关系以创建链接列表 我是Neo4j新手,所以不确定哪种方法更适合满足需求 对于第一个需求,我编写了以下查询,发现遍历的性能很差,但我确信这是一个构造糟糕的查询:Neo4j cypher-关系遍历与按属性排序,neo4j,cypher,Neo4j,Cypher,我有一个带有点列表的形状 我有以下要求: 1) 检索一组有序的点 2) 插入/删除点并保留其余点的顺序 我可以通过以下方式实现这一目标: A) 点具有可用于排序的序列整数属性 B) 在每个点之间添加:下一个关系以创建链接列表 我是Neo4j新手,所以不确定哪种方法更适合满足需求 对于第一个需求,我编写了以下查询,发现遍历的性能很差,但我确信这是一个构造糟糕的查询: //A) 146 ms Match (s:Shape {id: "1-700-y11-1.1.I"})-[:POINTS]->
//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);
要获得有序的点列表,请使用稍微修改过的第二个查询版本:
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
要获得有序的点列表,请使用稍微修改过的第二个查询版本:
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