Graph Neo4j-查找附近的节点集

Graph Neo4j-查找附近的节点集,graph,neo4j,cypher,graph-databases,shortest-path,Graph,Neo4j,Cypher,Graph Databases,Shortest Path,我希望使用Neo4j获得靠近某个节点的节点 考虑节点成本的方法很流行,但使用节点成本的方法并不流行 例如,在中,节点A附近的节点是B、C、E、G、H、I. 总成本在15%以内 不包括一个项目的费用 可以忽略边缘方向 示例图的节点之间的最小成本预计如下所示 A<->B : 3 A<->C : 8 A<->D : 50 A<->E : 10 A<->F : 16 A<->G : 11 A<->H : 13 A&l

我希望使用Neo4j获得靠近某个节点的节点

考虑节点成本的方法很流行,但使用节点成本的方法并不流行

例如,在中,节点A附近的节点是B、C、E、G、H、I.

  • 总成本在15%以内
  • 不包括一个项目的费用
  • 可以忽略边缘方向
示例图的节点之间的最小成本预计如下所示

A<->B : 3
A<->C : 8
A<->D : 50
A<->E : 10
A<->F : 16
A<->G : 11
A<->H : 13
A<->I : 14
回应评论。增加了计算成本的优势

MATCH (n)-[]-(m)
MERGE (n)-[r:COST{cost:m.cost}]->(m)
我执行了下面的查询

CREATE
(a:Node{name:"A",cost:10}),
(b:Node{name:"B",cost:3}),
(c:Node{name:"C",cost:5}),
(d:Node{name:"D",cost:50}),
(e:Node{name:"E",cost:10}),
(f:Node{name:"F",cost:8}),
(g:Node{name:"G",cost:1}),
(h:Node{name:"H",cost:2}),
(i:Node{name:"I",cost:1}),
(a)-[:Edge]->(b),
(b)-[:Edge]->(c),
(a)-[:Edge]->(d),
(a)-[:Edge]->(e),
(c)-[:Edge]->(f),
(d)-[:Edge]->(f),
(e)-[:Edge]->(g),
(g)-[:Edge]->(h),
(h)-[:Edge]->(i),
(f)-[:Edge]->(i);
MATCH(startNode:Node{name:"A"}),(endNode:Node)
CALL algo.shortestPath(startNode, endNode, "cost",{relationshipQuery:'COST', defaultValue:1.0,write:false,direction:'OUTGOING'})
YIELD nodeCount, totalCost
WITH nodeCount, totalCost, endNode
WHERE totalCost <= 15
RETURN nodeCount, totalCost, endNode
ORDER BY totalCost ASC;
然而,当我在实际使用的数据库中执行类似的查询时,由于计算量巨大,我无法执行该查询

Failed to invoke procedure `algo.shortestPath`: Caused by: java.lang.ArrayIndexOutOfBoundsException: -1340037571

有没有人有办法高效地搜索附近的节点集?

您可以使用以下密码查询:

MATCH p=(start {name:"A"})-[r*..10]-(end {name:"I"})
RETURN reduce(x=0, n IN tail(nodes(p)) | x + n.cost) AS cost
ORDER BY cost ASC
LIMIT 1
但在这种情况下,Neo4j将搜索
start
end
之间的所有现有路径,然后计算全局成本。所以这是一个昂贵的查询


如果您想要性能,您应该从graph algo中查看
algo.shortestPath
函数的实现,以创建您自己的过程/algo。

为什么不运行密码查询来更新节点的所有传入边,并将边的权重设置为节点的权重?那么,标准的边缘加权方法应该可以按照您的要求工作。谢谢您的评论。当我重建示例图时,它在图中正常工作。然而,在我实际想要应用的数据库上,计算复杂度已经变得非常巨大。。。有关详细信息,请查看已编辑的问题。
MATCH p=(start {name:"A"})-[r*..10]-(end {name:"I"})
RETURN reduce(x=0, n IN tail(nodes(p)) | x + n.cost) AS cost
ORDER BY cost ASC
LIMIT 1