是否可以编写一个具有可变长度模式的Cypher查询,该模式指定起始节点和结束节点之间的节点只能是具有特定属性的节点?
我认为像下面这样的查询将匹配以下所有模式:
MATCH p=(n:Node {foo:"True"})<-[:REL*0..2]-(:Node)<-[:REL]-(:Node {bar:"True"})
(n:Node {foo:"True"}) <-[:REL]-(:Node {bar:"True"})
(n:Node {foo:"True"}) <-[:REL]-(:Node) <-[:REL]-(:Node {bar:"True"})
(n:Node {foo:"True"}) <-[:REL]-(:Node) <-[:REL]-(:Node) <-[:REL]-(:Node {bar:"True"})
我想;复制";查询的CCD_ 2部分在CCD_ 3和CCD_。
这是正确的思考方式吗?如何使可变长度查询仅匹配中间节点中具有属性{bar:"True"}
的路径,如:
(n:Node {foo:"True"}) <-[:REL]-(:Node {bar:"True"})
(n:Node {foo:"True"}) <-[:REL]-({bar:"True}) <-[:REL]-(:Node {bar:"True"})
(n:Node {foo:"True"}) <-[:REL]-({bar:"True}) <-[:REL]-({bar:"True}) <-[:REL]-(:Node {bar:"True"})
下面的查询是正确的方法吗?
MATCH p=(n:Node {foo:"True"})<-[:REL*0..2]-(:Node {bar:"True"})<-[:REL]-(:Node {bar:"True"})
在我看来,情况并非如此。有人能澄清我在思考过程中哪里出了问题吗?
我认为如果foo是一个关系属性,而不是节点属性,那会很容易。
创建一个简单的示例:
MERGE (a:Node {name:"a", foo:True})
MERGE (b:Node {name:"b", bar:True})
MERGE (c:Node {name:"c", bar:True})
MERGE (d:Node {name:"d", bar:False})
MERGE (e:Node {name:"e", bar:True})
MERGE (a)<-[:REL]-(b)
MERGE (b)<-[:REL]-(c)
MERGE (a)<-[:REL]-(d)
MERGE (d)<-[:REL]-(e)
我认为您想匹配节点b和c,但不想匹配e,因为我们必须遍历具有foo:False的d。
使酒吧成为关系上的一个属性:
MATCH ()<-[r:REL]-(n:Node)
SET r.bar = n.bar
现在你可以写:
MATCH (:Node {foo:True})<-[:REL*0..2 {bar:True}]-(n:Node)
RETURN n.name
根据需要返回b和c。
MATCH path=(:Node {foo:True})-[:REL*0..2]-(n:Node {bar:True})
WHERE all(x in nodes(path) WHERE x.bar=True OR x.foo=True)
RETURN n.name