Cypher:如何匹配路径中的关系节点关系

时间:2015-10-31 02:53:08

标签: neo4j cypher

我是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个节点。

如何在路径中找到此模式匹配?

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
  1. MATCH在从a到x的路径上。
  2. 获取路径中的所有节点
  3. 对于路径中的每个节点,过滤我们有两个传入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通过零深度关系

连接

真是一种愚蠢的说法

  

ab是同一个节点

您可以查看(a {name: "a"})(x {name: "x"})之间具有五个节点路径的this console以及(a {name: "a2"})(x {name: "x2"})之间的三个节点路径。相同的模式将匹配这两个路径(只需更改name子句中WHERE的值)。两个路径将返回五列,因为查询返回五个标识符。在三节点路径的情况下,第一个结果列将与第二个相同,第四个到第五个 - 因为“节点a和节点b由一个连接零深度关系“只是意味着ab是相同的节点“

答案 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