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 有从 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)
....
我想要 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
考虑与此类似的查询:
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 有从 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)
....
我想要 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