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

时间:2019-06-07 10:57:24

标签: neo4j cypher limit

考虑类似以下查询:

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

查询返回从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)
....

我想返回具有相同EdgeID关系的路径。例如,对于LIMIT 1,我只想返回上述行中的一个,例如

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

(不一定是ID)

对于LIMIT 2,我想返回两个,例如:

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

我该怎么做?

1 个答案:

答案 0 :(得分:1)

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

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