Вернуть 1 узел даже при наличии дублирующих узлов в neo4j
Мне нужны только все узлы, которые являются уникальными, т. Е. Даже если существуют два или более узлов с одинаковыми свойствами (в данном случае это узлы с именем '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