首页 文章

neo4j找到具有匹配属性的所有节点

提问于
浏览
15

我有一个相对较大的节点集,我想找到所有具有匹配属性值的节点对,但我不知道或事先关心属性值是什么 . 这基本上是尝试查找重复节点,但我可以将重复的定义限制为具有相同属性值的两个或更多节点 .

任何想法如何进行?在neo4j文档中没有找到任何起点 . 我正在使用1.8.2社区版 .

EDIT
很抱歉在最初的问题中不清楚,但我在谈论通过Cypher这样做 .

7 回答

  • 2

    Cypher计算属性上的值,同时返回一组节点:

    start n=node(*)
    where has(n.prop)
    with n.prop as prop, collect(n) as nodelist, count(*) as count
    where count > 1
    return prop, nodelist, count;
    

    控制台上的示例:http://console.neo4j.org/r/k2s7aa

    您也可以使用属性进行索引扫描(以避免查看没有此属性的节点):
    start n=node:node_auto_index('prop:*') ...

    2.0带标签的Cypher标签:

    match (n:Label)
    with n.prop as prop, collect(n) as nodelist, count(*) as count
    where count > 1
    return prop, nodelist, count;
    
  • 0

    以下方法如何:

    • 使用getAllNodes在所有节点上获取Iterable .

    • 使用getPropertyKeysgetProperty(key)构建包含节点所有属性的 java.util.Map . 计算 Map 的 hashCode()

    • 使用hashCode作为键和一组 node.getId() 作为值构建全局 Map

    这应该给你复制的候选人 . 注意hashCode()语义,可能有不同属性的节点映射到相同的hashCode .

  • 0

    你可以试试这个我觉得无论你想做什么的人 .

    START n=node(*), m=node(*)
    WHERE 
      HAS(n.name) AND HAS (m.name) AND 
      n.name=m.name AND 
      ID(n) <ID(m) 
    RETURN n, m
    

    http://console.neo4j.org/?id=xe6wmt

    两个节点都应具有 name 属性 . name 对于两个节点应该相等,我们只需要通过id比较获得的两对可能性中的一对 . 不确定性能 - 请测试 .

  • 2

    Neo4j 3.1.1

    Cypher不再支持HAS,请使用EXISTS代替 .

    如果要查找具有特定属性的节点,则Cyper如下所示:

    MATCH (n:NodeLabel) where has(n.NodeProperty) return n
    
  • 0

    最好/最简单的选择是做一些像本地的 Map . 如果您执行了类似的操作,则可以创建如下代码:

    GlobalGraphOperations ggo = GlobalGraphOperations.at(db);
    Map<Object, Node> duplicateMap = new HashMap<Object, Node>();
    
    for (Node node : ggo.getAllNodes()) {
        Object propertyValue = node.getProperty("property");
        Node existingNode = duplicateMap.get(propertyValue);
        if (existingNode == null) {
            duplicateMap.put(propertyValue, node);
        } else {
            System.out.println("Duplicate Node. First Node: " + existingNode + ", Second Node: " + node);
        }
    }
    

    这将打印出一个列表 . 如果您需要执行更多操作,例如删除这些节点,则可以在else中执行某些操作 .

    你知道房产名称吗?这是多个属性,还是仅仅是单个名称/值对的重复?如果您正在执行多个属性,只需为您拥有的每个属性创建一个映射 .

  • 20

    您还可以在该属性上使用索引 . 然后,对于给定值,检索所有节点 . 优点是您还可以查询值的近似值 .

  • 1

    使用Neo4j 3.3.4,您可以简单地执行以下操作:

    MATCH (n) where EXISTS(n.propertyName) return n

    只需将 propertyName 更改为您要查找的任何属性 .

相关问题