首页 文章

Cypher阻止枚举所有路径

提问于
浏览
0

我开始使用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)

1 回答

  • 0

    Neo的Max De Marzi写了一篇关于这些类型的查询,所以对于不同节点而不是路径的唯一兴趣是可变长度匹配,将在未来版本中被查询计划者检测和优化,可能是3.2 .

    与此同时,当您提供'NODE_GLOBAL'作为唯一性参数时,APOC程序在其apoc.path.expandConfig()调用中有一个解决方案 .

    这将确保在路径扩展期间找到的节点仅访问一次,因此您不应该看到到同一节点的多个路径 .

    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;
    

相关问题