考虑类似以下查询:
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)
....
查询返回从b
到c
的许多关系,但是返回从c
到d
的单个关系
(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)
我该怎么做?
答案 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