Neo4J可变长度模式

5uzkadbs  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(192)

是否可以编写一个带有可变长度模式的Cypher查询,指定起始节点和结束节点之间的节点只能是具有特定属性的节点?
我认为像下面这样的查询将匹配以下所有模式:
<-[:REL]-(:Node)

(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"})

我想象它在(n:Node {foo:"True"})<-[:REL]-(:Node {bar:"True"})查询部分之间“复制”查询的<-[:REL]-(:Node)部分0到2次,并构造某种类型的匹配UNION。
这是正确的思考方式吗?我如何使变长查询只匹配中间节点具有{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"})
在我看来,情况并非如此。有人能澄清一下我在思考过程中哪里出错了吗?

qltillow

qltillow1#

我认为如果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。
使bar成为关系的属性:

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。

g6baxovj

g6baxovj2#

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

相关问题