вернуть 1 узел даже при наличии дублирующих узлов в neo4j - PullRequest
0 голосов
/ 20 сентября 2018

Рассмотрим узел. Person: enter image description here

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

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Если вы ищете только один результат, 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
0 голосов
/ 20 сентября 2018

Цифровой эквивалент 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
0 голосов
/ 20 сентября 2018

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

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

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

...