Cypher中的多步遍历?

时间:2015-02-11 00:36:35

标签: neo4j cypher traversal graph-databases

我有一个数据结构,其中数据由两类节点组成:itemclaimclaim表示关于该项目的一些信息,并且可以引用其他项目,例如 - 某个实体位于某个其他实体中,例如, “德国在欧洲”。示例结构:

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对的重复模式。

1 个答案:

答案 0 :(得分:2)

如果您想使用控制台中的数据找到,例如,欧洲的所有商品:

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测试。