neo4j如何在限制后续节点之间的关系数量之间查询变量节点?

neo4j how to query with variable nodes in between limiting the number of relations between subsequent nodes?

考虑与此类似的查询:

MATCH p=(b:label{ID:"M04"})-[r:Edge*2..2]-(d:label{ID:"S02"})
RETURN p LIMIT 10

暂且称中间节点为c。从 b 到中间节点和最终节点 d 的关系都是同一类型 Edge 并且具有 属性 EdgeID。从一个节点到另一个节点,存在 Edge 类型的不同关系,每个关系具有不同的 EdgeID 属性 值。下一个节点还有其他相同类型的关系,其中大多数具有相同的值 属性 EdgeID.

例如图表类似于:

(b)-[:Edge{EdgeID:1}]->(c)-[:Edge{EdgeID:1}]->(d)
(b)-[:Edge{EdgeID:2}]->(c)-[:Edge{EdgeID:2}]->(d)
(b)-[:Edge{EdgeID:3}]->(c)-[:Edge{EdgeID:3}]->(d)
....

查询 return 有从 bc 的许多关系,但是从 cd

的单个关系
(b)-[:Edge{EdgeID:1}]->(c)-[:Edge{EdgeID:1}]->(d)
(b)-[:Edge{EdgeID:2}]->(c)-[:Edge{EdgeID:1}]->(d)
(b)-[:Edge{EdgeID:3}]->(c)-[:Edge{EdgeID:1}]->(d)
....

我想要 return 具有相同 EdgeID 关系的路径。因此,例如 LIMIT 1 我只想 return 以上行中的一个,例如

(b)-[:Edge{EdgeID:123123}]->(c)-[:Edge{EdgeID:123123}]->(d)

(不一定是那个ID)

LIMIT 2我要return两个,例如:

(b)-[:Edge{EdgeID:123123}]->(c)-[:Edge{EdgeID:123123}]->(d)
(b)-[:Edge{EdgeID:872346}]->(c)-[:Edge{EdgeID:872346}]->(d)

我该怎么做?

您应该能够添加条件,即路径中的关系具有相同的 属性 值:

MATCH p=(b:label{ID:"M04"})-[:Edge*2]-(d:label{ID:"S02"})
WHERE relationships(p)[0].EdgeID = relationships(p)[1].EdgeID
RETURN p LIMIT 10

如果您需要对任意长度的路径进行这种限制,那么您可以这样做:

MATCH p=(b:label{ID:"M04"})-[:Edge*6]-(d:label{ID:"S02"})
WITH p, relationships(p)[0].EdgeID as edgeID
WHERE all(rel in tail(relationships(p)) WHERE rel.EdgeID = edgeID)
RETURN p LIMIT 10