【发布时间】:2017-02-11 21:56:06
【问题描述】:
我开始使用 Neo4j 并想知道如何找到连接到另一个节点的节点,其长度最多为 k 条边(朋友的朋友的朋友的朋友的朋友的朋友的朋友的朋友......最多 k 次)。我将用 Neo4j 本身的教程中的示例进行说明(我将图形创建命令放在底部)。
match (e {name:"Emil"})-[*1..2]-(p)
return DISTINCT e, p;
此查询将返回连接到 Emil 的节点以及连接到这些节点的节点。我的问题是,这似乎从 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)
【问题讨论】: