我开始使用Neo4j,并想知道如何找到连接到另一个节点的节点,长度至多为k个边缘(朋友的朋友的朋友......最多k次)。我将以Neo4j本身的教程为例来说明(我把图形创建命令放在最下面)。Cypher阻止列举所有路径
match (e {name:"Emil"})-[*1..2]-(p)
return DISTINCT e, p;
该查询将返回连接到埃米尔和连接到这些节点的节点的节点。我的问题是,它似乎枚举Emil长度为1-2的每条路径,但我并不关心列举所有路径。从查询中可以明显看出,我只关心在那个距离连接到Emil的节点,并且枚举所有可能的路径是实现该查询的一种很差的方式。随着复杂性变得非常强大,这是一个大型密集图形的问题。
删除DISTINCT,将会有8条记录,这是来自Emil的唯一的1-2长度路径的数量。根据我在较大图上的测试,似乎DISTINCT是一个后处理步骤,不会影响查询的运行时间,尽管它会消除冗余输出。那是对的吗?
我的主要问题是,有没有一种方法可以为这个问题形成一个Cypher查询,这样我就不会遍历所有的独特路径,复杂性可以降低?请让我知道我是否也有误解。
----命令来创建图形-----
CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),
(ir:Person { name: "Ian", from: "England", title: "author" }),
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)
谢谢!两者都是我正在寻找的。 – steve