gpt4 book ai didi

neo4j - 具有数学公式的复杂密码查询

转载 作者:行者123 更新时间:2023-12-01 10:05:54 25 4
gpt4 key购买 nike

我有一个包含 2 种节点的图表:personfood。我有一种关系 - Ate 和一个属性 - count。每当一个一个食物时,关系的count属性就会增加。

我的目标是计算两个 person 节点之间的相似度。在网上找到了这个计算相似度的算法,想用一下。如何将其转换为 Cypher 查询?

sim = 0
for k = 1 to n:
sim = sim + (1 - Math.abs((N1k/H1 - N2k/H2)))(N1k+N2k)/(H1+H2)

哪里:

sim = 相似度指数
H1 = 1
吃掉的食物总数H2 = 2
吃掉的食物总数n = common
food 节点的数量N1k = person 1 吃了 'n' 个常见 food 项目中的 'kth' food 项目的次数
N2k = 2 吃了“n”个常见food 项目中的“kth”food 项目的次数
/p>

我已经准备好骨架,但我不知道如何进行。

Start me=node(name="%s")
MATCH me-[r1:Ate]->some_food<-[r2:Ate]-other_dude
// do some stuff here to find out sim
RETURN other_dude, sim
ORDER BY sim DESC
LIMIT 10

感谢帮助!

最佳答案

我在 Neo4j 邮件列表上看到了这个问题,但昨天无法回复。

我是 Cypher 的新手。但是,我可以帮助您解决 Gremlin 中的问题。我可以创建一个类似于您的图表并对其运行 Gremlin 遍历。

我的图表看起来像:

gremlin> g.v(1,2,3,4)_().outE('eats').inV.path{it.name}{it.count}{it.name}  
==>[Neo, 5, Meat]
==>[Neo, 1, Cheese]
==>[Neo, 4, Chicken]
==>[Morpheus, 3, Bread]
==>[Morpheus, 3, Cheese]
==>[Morpheus, 2, Chicken]
==>[Trinity, 1, Apple]
==>[Trinity, 2, Bread]
==>[Trinity, 4, Meat]
==>[Trinity, 2, Cheese]
==>[Smith, 3, Apple]
==>[Smith, 4, Ham]
==>[Smith, 5, Pork]
gremlin>

我编写了一个遍历来为任何一个顶点生成相似性索引,由 start 指示剩余 ID 数组。我的最终遍历看起来像:

simarray=[];start=3;
[1,2,4].each{
p1=start;p2=it;
first=g.v(p1);
second=g.v(p2);
sim=0;
h1=first.out('eats').count().toFloat();
h2=second.out('eats').count().toFloat();
first.outE('eats').as('edges')
.inV.in('eats').has('id',second.id).back('edges')
.each{
n1k = it.count;
n2k = it.inV.inE('eats').outV
.has('id', second.id).back(2).count.next();
sim = sim + (1 - ((n1k/h1)-(n2k/h2)).abs())*(n1k+n2k)/(h1+h2)
};
simarray.add(sim)
};
simarray

输出:

gremlin> simarray=[];start=3;[1,2,4].each{p1=start;p2=it; first=g.v(p1); second=g.v(p2); sim=0; h1=first.out('eats').count().toFloat(); h2=second.out('eats').count().toFloat(); first.outE('eats').as('edges').inV.in('eats').has('id',second.id).back('edges').each{n1k = it.count; n2k = it.inV.inE('eats').outV.has('id', second.id).back(2).count.next(); sim = sim + (1 - ((n1k/h1)-(n2k/h2)).abs())*(n1k+n2k)/(h1+h2)}; simarray.add(sim)};simarray
==>0.7857142857142856
==>0.7142857142857143
==>0.14285714285714285

以上遍历直接转化为您的公式/计算。它可以针对性能 w.r.t. 进行优化。图遍历。此外,您可能希望通过 Gremlin 的文档来详细了解内容。 https://github.com/tinkerpop/gremlin/wiki

除了您已经加入的 Neo4j 邮件列表之外,您还可以在 Gremlin 邮件列表上提出您的疑问: https://groups.google.com/group/gremlin-users

关于neo4j - 具有数学公式的复杂密码查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10785795/

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