我开始使用Neo4j,并且想知道找到连接到另一个节点的节点,其长度最多为k个边缘(朋友的朋友...最多k次)。我将用Neo4j本身的教程中的示例进行说明(我将图形创建命令放在底部)。
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)
答案 0 :(得分:0)
Neo的Max De Marzi写了一篇关于这类查询的精彩blog post,因此,对于不同节点而不是路径唯一感兴趣的可变长度匹配将由查询规划器检测并优化。未来发布,可能是3.2。
与此同时,APOC程序在apoc.path.expandConfig()电话中有一个解决方案,当您提供NODE_GLOBAL'作为唯一性参数。
这将确保路径扩展期间找到的节点只访问一次,因此您不应该看到同一节点的多条路径。
match (e {name:"Emil"})
call apoc.path.expandConfig(e, {maxLevel:2, uniqueness:'NODE_GLOBAL'}) yield path
WITH e, last(nodes(path)) as subgraph
where e <> subgraph
return e, subgraph;