2013-04-22 3 views
3

У меня много профилей в виде узлов и вы хотите совместить узлы, у которых свойство имени имеет определенное строковое сходство.Найти сходство между узлами

Как это возможно с Neo4j?

Пример данные:

NodeA: { 
    "name": "Jacob F Saxberg" 
}, 
NodeB: { 
    "name": "Jacob Friis Saxberg" 
} 

Я хотел бы получить Левенштейн (4) или что-то подобное с Neo4j.

+1

Хотите ли вы выполнить что-то подобное с Cypher, или с вами будет хорошо реализовывать собственный код Java или Gremlin? – Nicholas

+0

Я надеялся на Cypher, но Гремлин выглядит интересно, могу ли я создать его в Node.js, что я использую для своего приложения? – webjay

+0

В Cypher я не верю, что вы можете определить пользовательские функции, подобные этому, и, похоже, не существует функции для выполнения этого типа алгоритма. Однако Gremlin позволяет вам получить полный доступ к «Groovy», чтобы вы могли писать функции, которые выполняют это. – Nicholas

ответ

3

Поскольку расстояние Левенштейн является функцией двух узлов f(nodeA, nodeB) и так как это симметричное (f(nodeA,nodeB)==f(nodeB,NodeA)), это может быть хорошим выбором для хранения результата расстояния Левенштейн как свойство на взаимосвязи между узлом А и узлом B.

Вы можете использовать cypher, чтобы найти все узлы, для которых должно быть рассчитано расстояние Levensthein. Используя Java (или ваш предпочтительный язык клиента), вы можете перебирать найденные узлы, выполнять математику и записывать результат обратно в график.

+0

Возможно, он может сохранить все имя как свойство, как у него сейчас, и создать новые узлы для каждой буквы алфавита [a-z] [A-Z], а новое относится к каждой из букв, которые исходный узел имени имеет в свойстве имени. чем, сравнение 2 узла для расстояния может выглядеть так: 'START n1 = node (1), n2 = node (2) MATCH n1 - [: letter] -l - [: letter] -n2 WITH n1, n2, l, count (*) как аналогичная длина RETURN (n1.name-like) + length (n2.name-like) как расстояние; ' – ulkas

+0

, но это более сложно, чем показалось мне впервые. для повторения букв нужно было бы добавить некоторый вес к «буквам». Кроме того, для огромной базы данных узлы писем могут вырасти до тонны rels и не будут работать быстро. – ulkas

+0

и Neo4j не будут помнить, что многие отношения? – webjay

Смежные вопросы