Neo4j - 将两个节点属性与 apoc.text.phonetic 进行比较
Neo4j - To compare two nodes properties with apoc.text.phonetic
在 人 的图表中,一些节点与 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 的决定?
大家自己判断。
你的第一个例子
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
的程序可以帮助您完成此操作。有了它,您可以定义一个阈值,或者直接将增量存储为您的关系的 属性 :
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 表示您的两个字符串非常不同。
在 人 的图表中,一些节点与 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 的决定?
大家自己判断。
你的第一个例子
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
的程序可以帮助您完成此操作。有了它,您可以定义一个阈值,或者直接将增量存储为您的关系的 属性 :
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 表示您的两个字符串非常不同。