Neo4j - 使用apoc.text.phonetic比较两个节点属性

时间:2018-02-13 08:28:45

标签: neo4j cypher neo4j-apoc

人员的图表中,某些节点以SAME_AS关系连接。

(p1:{name:'m.Verena von Habsburg-Laufenburg'})-[SAME_AS]-(p1:{name:'2m: 9.2.1354 Verena von Habsburg-Laufenburg'})

在第一个例子中,这些人实际上是相同的,但我们还有其他例子:

(p1:{name:'m.Gf Antal Pejácsevich de Verõcze (+1838)'})-[SAME_AS]-(p2: {name:'2m: Budapest 5.7.1880 Gf Arthur Pejácsevich de Verõcze'})

是否有机会通过apoc.text.phonetic找到决定?

1 个答案:

答案 0 :(得分:0)

你可以自己判断。

你的第一个例子

WITH [
    "m.Verena von Habsburg-Laufenburg",
    "2m: 9.2.1354 Verena von Habsburg-Laufenburg"
] AS texts
UNWIND texts AS text
CALL apoc.text.phonetic(text) YIELD value
RETURN text, value

结果是一样的:

text                                            value
"m.Verena von Habsburg-Laufenburg"              "M000V650V500H121L151"
"2m: 9.2.1354 Verena von Habsburg-Laufenburg"   "M000V650V500H121L151"

你的第二个例子

WITH [
    "m.Gf Antal Pejácsevich de Verõcze (+1838)",
    "2m: Budapest 5.7.1880 Gf Arthur Pejácsevich de Verõcze"
] AS texts
UNWIND texts AS text
CALL apoc.text.phonetic(text) YIELD value
RETURN text, value

结果不一样:

text                                                        value
"m.Gf Antal Pejácsevich de Verõcze (+1838)"                 "M000G100A534P200C120D000V600C000"
"2m: Budapest 5.7.1880 Gf Arthur Pejácsevich de Verõcze"    "M000B312G100A636P200C120D000V600C000"

结论

它适用于此示例,但我不确定您是否可以将其作为通用规则。数据沿袭是很难实现的,你没有任何保证,以确保100%。 但最终,apoc.text.phonetic可以帮助您实现目标。

更新

您的查询应该是这样的:

MATCH (n1:Person)-[r:SAME_AS]->(n2:Person)
CALL apoc.text.phonetic(n1.name) YIELD value AS n1Phonetic
CALL apoc.text.phonetic(n2.name) YIELD value AS n2Phonetic
WHERE n1Phonetic = n2Phonetic
WITH r
    SET r.samePhonetic=true

如果语音相同,我会将属性samePhonetic设置为true

此外,还有一个名为apoc.text.phoneticDelta的程序可以帮助您完成此操作。有了它,您可以定义一个阈值,或直接将delta存储为您的关系属性,如下所示:

MATCH (n1:Person)-[r:SAME_AS]->(n2:Person)
CALL apoc.text.phoneticDelta(n1.name, n2.name) YIELD delta
WITH r, delta
    SET r.phoneticDelta=delta

得分为4表示您的两个字符串非常相似。 得分为0意味着您的两个字符串非常不同。