我有一个数据结构,其中数据由两类节点组成:item
和claim
。 claim
表示关于该项目的一些信息,并且可以引用其他项目,例如 - 某个实体位于某个其他实体中,例如, “德国在欧洲”。示例结构:
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
对的重复模式。
答案 0 :(得分:2)
如果您想使用控制台中的数据找到,例如,欧洲的所有商品:
MATCH (v:item { name: "Europe" })<-[:claim|located*]-(x:item)
RETURN x;
如果您还想确保遍历的路径严格地在claim
和located
关系之间交替,这是一个有点棘手的方法:
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
测试。