gpt4 book ai didi

algorithm - 用于类似匹配的图形数据库(例如 Neo4j)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:19:36 25 4
gpt4 key购买 nike

我正在研究类似匹配的算法,并试图确定图形数据库是否是适合我的解决方案的最佳数据模型。我们以“找一辆相似的车”为例。

如果我们有这样的汽车数据:

Owner   |  Make    |  Model    |  Engine   |  Colour

Jeff | Ford | Focus | 1400cc | Light Red
Bob | Ford | Focus | 1800cc | Dark Red
Paul | Ford | Mondeo | 2000cc | Blue

我的理解是图形数据库对于以下查询会非常高效:

Get me all owners who own a car of the same make as Jeff

因为您将从“Jeff”节点开始,沿着“Make”边到达“Ford”节点,然后从这里沿着所有“Owner”边找到所有拥有福特的人。

现在我的问题是执行“相似”查找是否高效,例如:

Get me all owners whose car is within 500cc of Jeff

大概如果您将“1400cc”作为引擎节点,您将无法从此处遍历该图以找到其他大小相似的引擎,因此性能不佳。我的想法是,您必须运行某种通宵批处理以在所有引擎节点之间创建新边,这两个引擎之间的大小不同。

我的理解正确吗?图数据库看起来是否适合,或者是否有其他一些存储/检索/分析方法可以完全适合这个问题?

如果我想查看前 10 名最相似的汽车,我的相似度算法类似于“从 100% 开始,每 100cc 差异减去 2%,不同型号减去 20%,减去品牌不同扣 30%,颜色不同扣 20%(同一颜色不同深浅扣 5%)”。目前我能想到的唯一方法是让应用程序具有高性能,让后台任务不断迭代整个数据集并在每个所有者之间创建“相似性分数”边缘。

显然,对于小型数据集,解决方案并不重要,因为任何大杂烩都会有性能,但最终我们可能会拥有数十万辆汽车。

任何想法表示赞赏!

最佳答案

为了帮助您入门,这里有一个简单的模型,使用“Jeff”的示例数据进行说明:

(make:Make {name: "Ford"})-[:MAKES]->(model:Model {name: "Focus", cc: 14000, year: 2016})
(o:Owner {name: "Jeff"})-[:OWNS]->(v:Vehicle {vin: "WVWZZZ6XZXW068123", plate: "ABC123", color: "Light Red"})-[:MODEL]->(model)

获取所有拥有与 Jeff 相同品牌汽车的车主:

MATCH (o1:Owner { name: "Jeff" })-[:OWNS]->(:Vehicle)-[:MODEL]->(model:Model)<-[:MAKES]-(make:Make)
MATCH (make)-[:MAKES]->(:Model)<-[:MODEL]-(:Vehicle)<-[:OWNS]-(owners:Owner)
RETURN DISTINCT owners;

获取 Jeff 500cc 范围内的所有车主:

MATCH (o1:Owner { name: "Jeff" })-[:OWNS]->(:Vehicle)-[:MODEL]->(model:Model)<-[:MAKES]-(make:Make)
MATCH (make)-[:MAKES]->(x:Model)
WHERE (x.cc >= model.cc - 500) AND (x.cc <= model.cc + 500)
MATCH (x)<-[:MODEL]-(:Vehicle)<-[:OWNS]-(owners:Owner)
RETURN DISTINCT owners;

如果您首先在 :Owner(name) 上创建索引,上述查询会更快一些:

CREATE INDEX ON :Owner(name);

关于algorithm - 用于类似匹配的图形数据库(例如 Neo4j),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35604668/

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