Neo4j многомерный поиск - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь разработать поисковый запрос Neo4j, чтобы найти похожие выглядящие фотографии.

У меня есть 62 узла с меткой «Сходство», которые представляют фотографии, с которыми будут сравниваться все другие узлы с меткой «Фото». Мои данные выглядят так:

(p:Photo {name: 'treehouse'})-[r:LOOKS_LIKE {weight: 0.874655}]->(l:Likeness {name: 'lighthouse'})
(p:Photo {name: 'cat'})-[r:LOOKS_LIKE {weight: 0.00454}]->(l:Likeness {name: 'lighthouse'})
(p:Photo {name: 'house'})-[r:LOOKS_LIKE {weight: 0.4768}]->(l:Likeness {name: 'lighthouse'})
etc...

Все веса отношений находятся в диапазоне от 0 до 1.

Так что пример поиска может быть:

[
{name: 'lighthouse', value: 0.856378},
{name: 'car', value: 0.17854},
{name: 'tank', value: 0.034523},
{name: 'pencil', value: 0.078902}
]

Как мне вернуться узлы в порядке сходства (расстояния от) этих узлов и весов?

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Попробуйте этот запрос. Он находит все совпадения для вашего поиска, а затем вычисляет сходство как 1 минус разница между поиском и весом отношения. Он также возвращает отдельные изображения, которые соответствовали каждой фотографии в виде карты.

UNWIND [
{name: 'lighthouse', value: 0.856378},
{name: 'car', value: 0.17854},
{name: 'tank', value: 0.034523},
{name: 'pencil', value: 0.078902}
] AS s
MATCH (p:Photo)-[r:LOOKS_LIKE]->(l:Likeness)
WHERE l.name = s.name
RETURN p.name, SUM(1 - abs(r.weight - s.value)) AS similarity,
COLLECT({likeness:l.name, weight:r.weight, similarity: 1 - abs(r.weight - s.value)}) AS matches 
ORDER BY similarity desc
0 голосов
/ 24 марта 2020

Вы можете использовать предложения упорядочить и ограничить, чтобы вернуть указанное количество отсортированных результатов.

Попробуйте что-то вроде этого, чтобы увидеть, какие пять сходств наиболее близки к фотографии в домике на дереве.

MATCH (p:Photo {name:'treehouse'})-[r:LOOKS_LIKE]->(l:Likeness)
RETURN l.name, r.weight
ORDER BY r.weight DESC
LIMIT 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...