neo4j 通过直接关系的Cypher查询结果

htrmnn0y  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(128)

给定下图(其中所有关系都具有FOLLOWS类型),我们如何获得结果,以便根据给定节点的上一个和下一个节点进行分组?

H->G->E->D
     ->F
  • 其中H跟随G
  • 其中G跟在E和F之后。
  • E跟随D

因此,给定G的一些性质,期望结果如下:[{H}, {G}, {E, F}, {D}]
尝试:

MATCH (prev:Person)<-[:FOLLOWS *0..]-(p:Person)<-[:FOLLOWS *0..]-(next:Person) WHERE p.name ='G' RETURN collect(prev), p, collect(next) as result
klr1opcd

klr1opcd1#

从你的问题来看,似乎有两种解决方案。
为了说明我的意思,我将使用这个稍微复杂一点的图,其中包括H下游的FOLLOWS的合并:

┌───┐
                          ┌────▶│ J │
                          │     └───┘
┌───┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐
│ H │──▶│ G │──▶│ E │──▶│ D │──▶│ I │
└───┘   └───┘   └───┘   └───┘   └───┘
          │               ▲
          │               │
          │     ┌───┐   ┌───┐   ┌───┐
          └────▶│ F │──▶│ L │──▶│ K │
                └───┘   └───┘   └───┘

要按长度对从Personname = 'H'的每条路径进行分组,并多次显示相同的Person(因为从HD的路径不止一条),请使用以下命令:

MATCH p = (:Person {name: 'H'})-[:FOLLOWS*0..]->(e:Person)
WITH length(p) AS l, collect(e.name) AS people
RETURN collect(people) AS result

测试结果:

[["H"], ["G"], ["E", "F"], ["D", "L"], ["I", "J", "D", "K"], ["I", "J"]]

如果你想让每个人都出现一次,你可以使用shortestPath函数:

MATCH p = shortestPath((:Person {name: 'H'})-[:FOLLOWS*0..]->(e:Person))
WITH length(p) AS len, collect(e.name) AS people
RETURN collect(people) AS result

测试结果:

[["H"], ["G"], ["E", "F"], ["D", "L"], ["K", "I", "J"]]
enyaitl3

enyaitl32#

你的描述和你的例子并不完全相同:你说“给定节点的上一个和下一个节点”,你的例子有两个集合:next和after next
给定以下节点

create (:Person {name:"H"})-[:FOLLOWS]->(:Person {name:"G"})-[:FOLLOWS]->(:Person {name:"E"})-[:FOLLOWS]->(:Person {name:"D"});
match (g:Person {name:"G"}) merge (g)-[:FOLLOWS]->(:Person {name:"F"})

下面是一个可能查询

match (prev:Person)-[:FOLLOWS]->(p:Person {name:"G"})-[:FOLLOWS]->(next:Person)
optional match (next)-[:FOLLOWS]->(next2:Person)
return collect(distinct prev.name),p.name,collect(distinct next.name),collect(distinct next2.name)

这是另一个查询

相关问题