Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j cypher-关系遍历与按属性排序_Neo4j_Cypher - Fatal编程技术网

Neo4j cypher-关系遍历与按属性排序

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

我有一个带有点列表的形状

我有以下要求:

1) 检索一组有序的点

2) 插入/删除点并保留其余点的顺序

我可以通过以下方式实现这一目标:

A) 点具有可用于排序的序列整数属性

B) 在每个点之间添加:下一个关系以创建链接列表

我是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);

要获得有序的点列表,请使用稍微修改过的第二个查询版本:

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