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 означает, что ваши две строки очень разные.

Другие вопросы по тегам