neo4j 在数百万个节点之间创建关系的优化方法

qxgroojn  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(162)

我将节点上传到neo4j,每个节点都有emailphoneaddress等属性。我需要创建两个节点之间的关系,如果节点的属性之间的Levenshtein距离的总和小于一个阈值。如何以更优化的方式做到这一点?目前,我是这样做的:

MATCH (p1:sample500K) WITH p1 
MATCH (p2:sample500K)
WHERE id(p1) <id(p2)
AND (
  apoc.text.levenshteinDistance(p1.email, p2.email) + 
  apoc.text.levenshteinDistance(p1.phone, p2.phone) + 
  apoc.text.levenshteinDistance(p1.mobilephone, p2.mobilephone) +
  apoc.text.levenshteinDistance(p1.street, p2.street)) <= $threshold
MERGE (p1)-[:SAME_USER500K]->(p2)

字符串
我也试过apoc.periodic.iterate,这也很花时间。另外,我需要在Python中运行查询。
有人能提出一个更好的方法或任何改变,如果需要作出?

wrrgggsh

wrrgggsh1#

这是一个基本的指数级难题;更多的输入数据将导致使用类似蛮力的方法进行检查的更多可能性。
因此,我建议将您的方法分为两步:
1.从输入数据生成矢量表示。我自己的搜索表明,你可以将字符串输入数据传递给n-gram frunctions以获得原始字符串的小块,然后你可以将其传递给tf-idf函数以获得实际的向量。对所有的输入参数都这样做,确保向量总是相同的长度,合并它们并将它们放入向量数据库。
1.在向量数据库中执行向量相似性搜索以获得相似的记录,这可能满足您的levenshtein距离要求。然后以类似蛮力的方式检查每个返回元素的需求。
这种方法可以大大减少您必须执行的检查量,但是需要一个矢量数据库。我认为Neo4j有基本的矢量功能,但我不确定它们有多好。关键的方面是向量相似性搜索本身。
注意:如果某个n-gram片段不是另一个n-gram结果的一部分,则n-gram数据到向量步骤可能不一致。这可能需要一些测试或更多的标准化,不确定。

相关问题