2015-02-11 32 views
0

我有一个数据结构,其中数据由两种节点组成:itemclaimclaim代表关于物品的一些信息并且可以指其他物品,例如 - 某个实体位于某个其他实体中,例如, “德国在欧洲”。示例结构:Cypher中的多步遍历?

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

回答

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

+0

这将适用于我提供的迷你数据示例,但当然这不是真实的数据。我认为它可以匹配索赔和所在位置的任何组合,即索赔 - 索赔 - 索赔,定位 - 索赔等。但是有没有一种方法可以匹配特定的顺序“索赔,然后定位,任何次数“? – StasM 2015-02-11 01:57:18

+0

我简化了我的第二个查询。 – cybersam 2015-02-13 02:06:54