gpt4 book ai didi

Neo4J:如何从路径集合中找到唯一节点

转载 作者:行者123 更新时间:2023-12-01 06:24:59 25 4
gpt4 key购买 nike

我正在使用 neo4j 来解决实时规范化问题。假设我有来自 2 个不同来源的 3 个地方。 1 个源 45 给了我 2 个实际上彼此重复的位置,1 个源 55 给了我 1 个正确的标识符。但是,对于任何地点标识符(重复与否),我想找到由提要标识符唯一的最接近的一组地点。我的数据看起来像这样:

CREATE (a: Place {feedId:45, placeId: 123, name:"Empire State", address: "350 5th Ave", city: "New York", state: "NY", zip: "10118" })
CREATE (b: Place {feedId:45, placeId: 456, name:"Empire State Building", address: "350 5th Ave", city: "New York", state: "NY"})
CREATE (c: Place {feedId:55, placeId: 789, name:"Empire State", address: "350 5th Ave", city: "New York", state: "NY", zip: "10118"})

我已经通过匹配节点连接了这些节点,所以我可以对数据进行一些规范化。例如:
MERGE (m1: Matching:NameAndCity { attr: "EmpireStateBuildingNewYork", cost: 5.0 })
MERGE (a)-[:MATCHES]-(m1)
MERGE (b)-[:MATCHES]-(m1)
MERGE (c)-[:MATCHES]-(m1)
MERGE (m2: Matching:CityAndZip { attr: "NewYork10118", cost: 7.0 })
MERGE (a)-[:MATCHES]-(m2)
MERGE (c)-[:MATCHES]-(m2)

当我想从起始位置 id 中找到最接近的匹配项时,我可以在起始节点的所有路径上运行匹配项,按成本排序,即:
MATCH p=(a:Place {placeId:789, feedId:55})-[*..4]-(d:Place)
WHERE NONE (n IN nodes(p)
WHERE size(filter(x IN nodes(p)
WHERE n = x))> 1)
WITH p,
reduce(costAccum = 0, n in filter(n in nodes(p) where has(n.cost)) | costAccum+n.cost) AS costAccum
order by costAccum
RETURN p, costAccum

但是,由于有多个路径到同一个地方,所以在这样查询时,我会多次复制同一个节点。是否可以收集节点及其成本,然后只返回一个不同的子集(例如,从提要 4555 中给我最好的结果?

我怎样才能返回一组不同的路径,按成本排序,并按提要标识符唯一?我在构建这种类型的问题是错误的吗?

请帮忙!

最佳答案

你可以收集每个地方d的所有路径,然后在每个集合中取最好的路径(因为它们会被排序然后收集)

MATCH p=(a:Place {placeId:789, feedId:55})-[*..4]-(d:Place)
WITH d, collect(p) as paths,
reduce(costAccum = 0, n in filter(n in nodes(p) where has(n.cost)) | costAccum+n.cost) AS costAccum
order by costAccum
RETURN head(paths) as p, costAccum

关于Neo4J:如何从路径集合中找到唯一节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29864605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com