我有一个相对较大的节点集,我想找到所有具有匹配属性值的节点对,但我不知道或事先关心属性值是什么.这基本上是尝试查找重复节点,但我可以将重复的定义限制为具有相同属性值的两个或更多节点.
任何想法如何进行?在neo4j文档中没有找到任何起点.我正在使用1.8.2社区版.
编辑
很抱歉在最初的问题中不清楚,但我在谈论通过Cypher这样做.
Eve*_*man 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;
Run Code Online (Sandbox Code Playgroud)
控制台上的示例: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;
Run Code Online (Sandbox Code Playgroud)
最好/最简单的选择是做类似 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);
}
}
Run Code Online (Sandbox Code Playgroud)
这将打印出一个列表。如果您需要执行更多操作,例如删除这些节点,您可以在 else 中执行某些操作。
你知道楼盘名称吗?这是多个属性,还是只是单个名称/值对的重复项?如果您要处理多个属性,只需为您拥有的每个属性创建一个地图即可。