17

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

任何想法如何进行?在 neo4j 文档中找不到任何起点。我在 1.8.2 社区版。

编辑
很抱歉在最初的问题中不清楚,但我正在谈论通过 Cypher 来做这件事。

4

7 回答 7

22

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;

3.x 的更新:has已替换为exists.

于 2013-06-04T19:21:21.360 回答
3

你可以试试这个我认为你想做的事。

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

于 2013-05-31T14:16:07.890 回答
2

以下方法怎么样:

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

这应该为您提供重复的候选人。请注意 hashCode() 语义,可能会有不同属性的节点映射到相同的 hashCode。

于 2013-05-29T18:24:20.807 回答
1

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

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

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

于 2018-07-11T13:56:27.503 回答
1

Neo4j 3.1.1

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

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

MATCH (n:NodeLabel) where has(n.NodeProperty) return n
于 2017-03-13T13:17:03.440 回答
0

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

于 2013-05-30T16:10:12.640 回答
0

最好/最简单的选择是做类似 local 的事情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 中做一些事情。

你知道物业名称吗?这将是多个属性,还是只是单个名称/值对的副本?如果您正在做多个属性,只需为您拥有的每个属性创建一个地图。

于 2013-05-29T18:20:13.103 回答