Neo4j - сравнить свойства двух узлов с 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?
1 ответ
Вы можете судить по себе.
Ваш первый пример
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 означает, что ваши две строки очень разные.