Neo4j多维搜索

问题描述 投票:0回答:2

我正在尝试开发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}
]

如何按相似性(与这些节点和权重的距离)返回节点?

search neo4j
2个回答
0
投票

您可以使用order by和limit子句返回指定数量的排序结果。

尝试类似的操作,看哪五个相似度最接近树屋照片。

MATCH (p:Photo {name:'treehouse'})-[r:LOOKS_LIKE]->(l:Likeness)
RETURN l.name, r.weight
ORDER BY r.weight DESC
LIMIT 5

0
投票

尝试此查询。它找到要搜索的所有匹配项,然后将相似度计算为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
© www.soinside.com 2019 - 2024. All rights reserved.