Cypher 中的多步遍历?

Multi-step traversal in Cypher?

我有一个数据结构,其中数据由两种节点组成:itemclaimclaim 表示有关该项目的一些信息,并且可以引用其他项目,例如 - 某个实体位于某个其他实体中,例如"Germany is in Europe"。示例结构:

create 
(v1:item {id:"Q1", name: "Europe"}),
(v2:item {id:"Q2", name: "France"}),
(v3:item {id:"Q3", name: "Germany"}),
(v4:item {id:"Q4", name: "Bavaria"}),
(v5:item {id:"Q5", name: "Munich"}),
(c1:claim:located),
(c2:claim:located),
(c3:claim:located),
(c4:claim:located),
(v5)-[:claim]->c4,
(c4)-[:located]->v4,
(v4)-[:claim]->c3,
(c3)-[:located]->v3,
(v3)-[:claim]->c2,
(c2)-[:located]->v1,
(v2)-[:claim]->c1,
(c1)-[:located]->v1;

也在http://console.neo4j.org/?id=ncbom6。现在,如果我想遍历它——例如要弄清楚德国或欧洲的所有项目,我该怎么做?在这个模型中使用 Cypher 有可能吗?我知道有类似 v1-[r:*]->v2 的东西,但这假定了一种特定关系或任何关系,我需要 claim-located 对的重复模式。

例如,如果您想使用控制台中的数据查找欧洲的所有项目:

MATCH (v:item { name: "Europe" })<-[:claim|located*]-(x:item)
RETURN x;

如果您还想确保遍历的路径在 claimlocated 关系之间严格交替,这里有一个有点棘手的方法:

MATCH (v:item { name: "Europe" })<-[rel:claim|located*]-(x:item)
WHERE REDUCE(s = 0, x IN rel | CASE
             WHEN (s = 0 AND TYPE(x)= 'claim')
             THEN 1
             WHEN (s = 1 AND TYPE(x)= 'located')
             THEN 0
             ELSE NULL END )= 0
RETURN x;

如果需要额外检查,您可以修改 WHEN 测试。