Вернуть 1 узел даже при наличии дублирующих узлов в neo4j

Рассмотрим узел Person: введите описание изображения здесь

Мне нужны только все узлы, которые являются уникальными, т. Е. Даже если существуют два или более узлов с одинаковыми свойствами (в данном случае это узлы с именем 'B'), мне нужен только один узел среди дублирующих узлов в моем операторе поиска (только в этом случае должен быть возвращен один узел 'B' из двух), который будет выглядеть примерно так: MATCH (n:PERSON) WHERE [ n.name уникален] RETURN n.name . Могу ли я узнать, каков точный запрос для моего требования?

3 ответа

Я не совсем уверен, что вы после. Destinct вернет B только один раз

MATCH (n :Person {name: 'B'})
RETURN DISTINCT n

Надеюсь, поможет

Сайферный эквивалент MATCH (n:PERSON) WHERE [ n.name is unique ] RETURN n.name будет просто MATCH (n:PERSON) RETURN DISTINCT n.name, RETURN DISTINCT отфильтровывает любые повторяющиеся результаты строки. Если вы вернули узел, функция RETURN DISTINCT не будет работать, потому что разные идентификаторы внутреннего узла будут отличать 2 строки друг от друга.

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

MATCH (n) 
// Collect results into one list for filtering
WITH COLLECT(n) as ns 
RETURN FILTER(n IN ns 
  WHERE NONE(
    // Remove nodes that share all properties
    PROPERTIES(n)=PROPERTIES(x) AND
    // But keep 1 instance. In this case, the one with the lowest ID
    x in ns WHERE ID(x) < ID(n)
)) as ns

Если вы ищете только один результат, LIMIT должен сделать трюк:

MATCH (n:Person{name:'B'})
RETURN n LIMIT 1

Если вы ищете на основе нескольких строк, таких как набор входных данных, вам нужен только один результат на строку, поэтому вы можете собрать и получить первый результат:

UNWIND ['A','B','C'] as name
MATCH (n:Person {name:name})
WITH name, head(collect(n)) as n
RETURN n

Если у вас есть доступ к процедурам APOC, вы также можете использовать функции агрегирования APOC:

UNWIND ['A','B','C'] as name
MATCH (n:Person {name:name})
WITH name, apoc.agg.first(n) as n
RETURN n
Другие вопросы по тегам