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

时间:2013-05-29 15:59:33

标签: neo4j cypher

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

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

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

7 个答案:

答案 0 :(得分:21)

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;

答案 1 :(得分:2)

以下方法如何:

  • 使用getAllNodes在所有节点上获取Iterable。
  • 使用getPropertyKeysgetProperty(key)构建包含节点所有属性的java.util.Map。计算地图的hashCode()
  • 使用hashCode作为键并使用一组Map作为值来构建全局node.getId()

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

答案 2 :(得分:2)

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

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比较获得的两对可能性中的一对。不确定性能 - 请测试。

答案 3 :(得分:1)

Neo4j 3.1.1

  

Cypher不再支持HAS,请改用EXISTS。

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

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

答案 4 :(得分:1)

使用Neo4j 3.3.4,您可以轻松地执行以下操作:

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

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

答案 5 :(得分: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中执行某些操作。

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

答案 6 :(得分:0)

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