即使在neo4j中存在重复节点,也将返回1个节点

时间:2018-09-20 11:49:33

标签: neo4j cql

考虑节点Person: enter image description here

我需要所有仅唯一的节点,即,即使存在两个或多个具有相同属性的节点(在这种情况下,这是名称为“ B”的节点)我在搜索语句中的重复节点中也只需要一个节点(在在这种情况下,仅返回两个节点之间的一个“ B”节点),就像这样的MATCH(n:PERSON)WHERE [n.name is unique] RETURN n.name。 我能知道我的要求的确切查询是什么吗?

3 个答案:

答案 0 :(得分:0)

我不太确定你在追求什么。命运只返回一次B

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

希望有帮助

答案 1 :(得分:0)

如果您只想查找单个结果,则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

答案 2 :(得分:0)

相当于MATCH (n:PERSON) WHERE [ n.name is unique ] RETURN n.name的密码就是MATCH (n:PERSON) RETURN DISTINCT n.nameRETURN DISTINCT过滤掉所有重复的行结果。如果您返回了该节点,那么RETURN DISTINCT将不起作用,因为不同的内部节点ID将使两行彼此不同。

现在,假设您确实想返回节点,但想忽略它们的内部ID,则需要执行以下操作……

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