Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j Cypher:如何匹配路径中的关系节点关系_Neo4j_Cypher - Fatal编程技术网

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

Neo4j Cypher:如何匹配路径中的关系节点关系,neo4j,cypher,Neo4j,Cypher,我对Cypher和Neo4j(以及堆栈溢出)还不熟悉,所以希望这个问题有一个简单的答案。我花了数小时阅读文档和谷歌搜索,但没有找到确切的答案 显然,我需要更多的声誉来发布图片,所以我会尽我所能与文字 我可以找到从一个节点到另一个节点的路径,如下所示: MATCH path = (a {name:"a"})-[*]-(x {name:"x"}) RETURN extract(r IN nodes(path) | r); 这可能会返回以下两条路径: (a)-[:RED]-&

我对Cypher和Neo4j(以及堆栈溢出)还不熟悉,所以希望这个问题有一个简单的答案。我花了数小时阅读文档和谷歌搜索,但没有找到确切的答案

显然,我需要更多的声誉来发布图片,所以我会尽我所能与文字

我可以找到从一个节点到另一个节点的路径,如下所示:

    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)
(a)-[:RED]->(b)(f)(h)(findme)(findme)这个怎么样:

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 p=(a{name:“a”})-[*]-(x{name:“x”})
以节点(p)作为节点
将节点展开为n

使用n WHERE exists(()-[:RED]->(n)您已经很接近了!正如您已经知道的,
*
表示可变长度/深度。您可以像在查询中一样单独使用该符号,也可以指定一个范围。如果没有指定的范围,
*
表示“一个或多个”。如果您应用了上一个查询

MATCH (a)-[*]-(b)-[:RED]->(findme)<-[:RED]-(c)-[*]-(x)
WHERE a.name = "a" AND x.name = "x"
RETURN findme
此查询将匹配仅由您正在查找的“红色三元组”组成的路径,以及在三元组的一侧或两侧具有扩展关系的路径

值得注意的是,与“零案例”匹配的“零或多”范围的模式在模式中有两个标识符,但只有一个节点。因此,该节点绑定到两个标识符。对于上面模式左侧的标识符,当它匹配三个节点路径时

节点
a
和节点
b
通过零深度关系连接

这真是一种愚蠢的说法

a
b
是同一个节点


您可以检查在
(a{name:“a”})
(x{name:“x”})
之间有一个五节点路径,在
(a{name:“a2”})
(x{name:“x2”})
之间有一个三节点路径。相同的模式将匹配这两个路径(只需更改
WHERE
子句中
name
的值即可)。两个路径都将返回五列,因为查询返回五个标识符。对于三节点路径,第一个结果列将与第二个相同,第四个结果列与第五个结果列相同–因为“节点
a
和节点
b
通过零深度关系连接”仅表示“
a
b
是同一个节点。”

我喜欢有多个答案可以完成这项工作:)

这是我的:

MATCH path=(a {name:"a"})-[*]-(x {name:"x"})
RETURN filter(x in nodes(p) WHERE size((x)<-[:RED]-()) = 2) as n
MATCH path=(a{name:“a”})-[*]-(x{name:“x”})

返回筛选器(x)在节点(p)中,其中大小((x)“红色”关系是否必须是路径的一部分,或者“findme”节点位于路径上,并且“红色”关系来自路径之外的节点就足够了?旁注:您在return子句中进行的提取似乎是无关的。除非您对节点所做的操作多于将其从路径中拉出,否则您可以直接返回节点(路径)
。@jjaderberg,是的,“红色”节点必须在路径上。很抱歉没有澄清这一点。另外,感谢关于返回节点(路径)的提示。我不知道该命令也会返回关系。非常好!如果“红色”关系必须是路径的一部分(不确定这是否是一项要求)您也需要检查一下,对吗?目前为止,该查询还将返回路径上的节点,这些节点具有来自路径外节点的传入“红色”关系。@William Lyon感谢有关展开的提示,该提示似乎对路径上的每个节点都起作用。在这种情况下,我需要红色关系沿着路径(很抱歉没有指定),但您的答案将来可能会派上用场。我很好奇是否有办法修改答案,以确保红色关系在路径中?+1是的,大小很可爱!但当“红色”关系不在路径中时,此查询也会匹配,对吗?我不确定op是否需要,或者红色是否应该包含在路径中从a到x的路径。@Christophen Willemsen“大小”的答案非常聪明。我以前没有见过。在这种情况下,我需要红色关系沿着路径(很抱歉没有指定)。您的答案是否有可能包含此限制条件的修改?@BradStone没有比Jonathan的答案更好的东西:)然而,我建议加入neo4j slack用户频道,如果这种查询是您经常需要做的事情,我会请您谈谈您的模型,以及我们如何帮助您改进它-我的意思是,从性能角度来看,这并不是我们在这方面倾向于做的最好的查询production@ChristopheWillemsen,谢谢你的提示。我现在在近地天体4j用户松弛组。随着我获得更多经验,性能调整将非常重要。顺便问一句,您建议加入哪些特定渠道?是的,帮助建模和帮助cypher了解一般问题感谢非常详细的回答。我需要的信息是“当它匹配三个节点路径时,说节点a和节点b通过零深度关系连接真是一种愚蠢的说法,说a和b是同一个节点!
MATCH (a)-[*]-(b)-[:RED]->(findme)<-[:RED]-(c)-[*]-(x)
WHERE a.name = "a" AND x.name = "x"
RETURN findme
(a)-[:RED]->(findme)<-[:RED]-(x)
MATCH (a)-[*0..]-(b)-[:RED]->(findme)<-[:RED]-(c)-[*0..]-(x)
WHERE a.name = "a" AND x.name = "x"
RETURN findme
MATCH path=(a {name:"a"})-[*]-(x {name:"x"})
RETURN filter(x in nodes(p) WHERE size((x)<-[:RED]-()) = 2) as n