【发布时间】:2015-10-31 02:53:07
【问题描述】:
我是 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 个节点。
如何在路径中找到这种模式匹配?
【问题讨论】:
-
“红色”关系是否必须是路径的一部分,或者“findme”节点在路径上就足够了,“红色”关系来自路径外的节点?
-
旁注:您在 return 子句中进行的提取似乎无关紧要。除非您对节点做更多的事情而不是将它们拉出路径,否则您可以直接
RETURN nodes(path)。 -
@jjaderberg,是的,“红色”节点必须在路径上。很抱歉没有澄清这一点。另外,感谢有关返回节点(路径)的提示。我不知道该命令也会返回关系。非常好!