我是Cypher和Neo4j(以及Stack Overflow)的新手,所以希望这个问题有一个简单的答案。我花了几个小时阅读文档和谷歌搜索,但没有找到确切的答案回答这个问题。
显然我需要更多的声望来发布图片,所以我会尽力使用文字。
我可以找到从一个节点到另一个节点的路径,如下所示:
MATCH path = (a {name:"a"})-[*]-(x {name:"x"})
RETURN extract(r IN nodes(path) | r);
可以返回类似以下两条路径的内容:
(a)-[:RED]->(b)<-[:BLUE]-(c)-[:RED]->(f)<-[:RED]-(g)-[:BLUE]->(h)<-[:RED]-(x)
(z)-[:RED]->(h)<-[:RED]-(x)
到目前为止一切顺利。当然,数据库中有许多其他关系和节点连接到这些节点,但这是正确的路径。
我需要在路径中找到一个节点,它有两个RED关系,如下所示:
-[:RED]->(findme)<-[:RED]-
在上面的两个路径示例中,findme =(f)和(h)。
注意:数据库中会有很多匹配项,但我只想要路径中的匹配项(只应该是一个)。此外,路径中可能有许多节点和不同的关系,或者只有3个节点通过RED关系连接。
我尝试使用匹配:
MATCH (a)-[*]-(b)-[:RED]->(findme)<-[:RED]-(c)-[*]-(x) RETURN findme;
只要至少有5个节点就可以工作,但不适用于3个节点。
如何在路径中找到此模式匹配?
答案 0 :(得分:1)
这个怎么样:
MATCH p=(a {name:"a"})-[*]-(x {name:"x"})
WITH nodes(p) AS nodes
UNWIND nodes AS n
WITH n WHERE exists(()-[:RED]->(n)<-[:RED]-())
RETURN n
MATCH
在从a到x的路径上。RED
关系的节点答案 1 :(得分:1)
你很亲密!如您所知,*
表示可变长度/深度。您可以像在查询中一样使用该符号,也可以指定范围。如果没有指定范围,*
表示“一个或多个”。如果您应用上一个查询
MATCH (a)-[*]-(b)-[:RED]->(findme)<-[:RED]-(c)-[*]-(x)
WHERE a.name = "a" AND x.name = "x"
RETURN findme
到具有三个节点的路径
(a)-[:RED]->(findme)<-[:RED]-(x)
路径中的两个关系可以与查询的非变量部分匹配。但是,没有任何关系可供变量部分匹配。部分(a)-[*]-(b)
和(c)-[*]-(x)
每个都需要“一个或多个”,但没有匹配的关系。
您可以通过明确指定为范围来将*
的含义更改为“零或更多”。通过这种方式,当路径中没有任何关系时,查询的两个可变部分也将匹配。
MATCH (a)-[*0..]-(b)-[:RED]->(findme)<-[:RED]-(c)-[*0..]-(x)
WHERE a.name = "a" AND x.name = "x"
RETURN findme
此查询将匹配仅包含您要查找的“红色三元组”的路径,以及在三元组的一侧或两侧具有关系的路径。
值得注意的是,具有“零或更多”范围匹配的“零情况”模式将在模式中具有两个标识符,但只有一个节点。因此,节点绑定到两个标识符。对于上图中左侧的标识符,当它与三节点路径匹配时,说
节点
连接a
和节点b
通过零深度关系
真是一种愚蠢的说法
a
和b
是同一个节点
您可以查看(a {name: "a"})
和(x {name: "x"})
之间具有五个节点路径的this console以及(a {name: "a2"})
和(x {name: "x2"})
之间的三个节点路径。相同的模式将匹配这两个路径(只需更改name
子句中WHERE
的值)。两个路径将返回五列,因为查询返回五个标识符。在三节点路径的情况下,第一个结果列将与第二个相同,第四个到第五个 - 因为“节点a
和节点b
由一个连接零深度关系“只是意味着”a
和b
是相同的节点“。
答案 2 :(得分:1)
我喜欢有多个答案可以完成这项工作:)
这是我的:
MATCH path=(a {name:"a"})-[*]-(x {name:"x"})
RETURN filter(x in nodes(p) WHERE size((x)<-[:RED]-()) = 2) as n
+1 Will和Jonathan