如何在Neo4j中查找二级关系?

8
我的neo4j图如下所示:
300连接到100100连接到201400
我想找出neo4j中的第二级连通性。
例如:对于300的第二级节点,应返回201400
在neo4j中是否可能实现? 当我使用以下cypher查询时:
MATCH (n)-[:CALLED*2]-(result) WHERE n.name = '300' RETURN result
它应该只给我201和400,但它返回如下结果:
1个回答

8
这在Neo4j中非常容易。如果您正在使用Cypher,可能是这样的:

这个查询在Cypher中的语法可能是:

MATCH (n)-[:CALLED]-()-[:CALLED]-(result)
WHERE n.id = 300
RETURN result

我假设这里的"id"属性是保存识别数字的,但显然你可以更改它。
你甚至可以像这样制作可变长度的路径:
MATCH (n)-[:CALLED*2]-(result)
WHERE n.id = 300
RETURN result

然而,问题的一部分在于此将返回节点 #200。符合您所需结果的一个查询是:

MATCH (n)-[:CALLED]->()<-[:CALLED]-(result)
WHERE n.id = 300
RETURN result

这仅匹配中间节点具有指向它的关系。


1
@brian-underwood 说得好。值得指出的是,如果对他的示例运行您的第一个查询,将返回许多结果。他们可能希望匹配节点300以"anchor"查询。此外,通过将方向添加到关系中,可以通过限制图遍历来进一步细化查询。 - ceej
1
好的,谢谢!我刚才编辑时假设存储这些数字的属性是“id”。 - Brian Underwood
嗨,布赖恩。我刚刚改变了一个节点的方向...添加了图的快照...前两个查询给了我4个节点...而不是应该只返回201和400。 - Amaresh
@Aman - 这是您查询的预期结果。您正在请求与关系:CALLED通过路径长度为2与300相关的节点。返回的所有节点都符合此模式。 - ceej
但我的观点是为什么节点100正在显示...这是因为neo4j将节点100视为第二级,可能是由于其反向连接...现在我正在逐渐理解显示结果的原因。 - Amaresh
是的。因为如果遍历的第一个节点是200,那么这就是第二层...这就是方向性变得重要的原因。 - ceej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接