与Merge Neo4j Cypher一起使用MAX的聚合函数

时间:2017-01-17 17:56:29

标签: neo4j cypher

我是neo4j的新手,我正在寻求帮助。 我有两个名为entity1和entity2的实体,他们的关系是定义的(CEO),但我成功加载数据并使用合并形成关系

置信度值|实体1 |实体2 |关系

0.884799964 |杰米戴蒙|摩根大通| CEO

0.884799964 |杰米戴蒙|摩根大通| CEO

0.380894504 |杰米戴蒙|摩根大通| CEO

我的问题:Jamie Dimon的置信度值为0.88和0.38, 现在我想显示Jamie Dimon和JPMorgan之间的单一关系,它保持最大置信度值(0.88) < /强>

通过这个查询,我能够显示2个置信度值为0.88和0.38而不是3个关系的关系,但我想要一个能保持最大信心的单一关系。

LOAD CSV WITH HEADERS FROM 'file:/result_is_of_neo4j_final1.csv' AS line
MERGE (e1:Entity1 {name: line.relation_first, e1_confidence: toFloat(line.entities_0_confidence)})
WITH line, e1
MERGE (e2:Entity2 {name : line.relation_second, e2_confidence: toFloat(line.entities_1_confidence)})
WITH e2, e1, line
MERGE (e1)-[r:IS_FROM {relation : line.relation_relation, r_confidence: toFloat(line.relation_confidence)}]->(e2)
RETURN e1,r,e2

1 个答案:

答案 0 :(得分:0)

您计划以这种方式加载多少数据?如果它是一个很大的导入,你可能会想要使用PERIODIC COMMIT来加速导入并避免内存问题。但是,这样做也会影响导入中的任何类型的比较和条件逻辑,因为不能保证您需要比较的行在同一事务中执行。

我建议您在没有任何额外逻辑的情况下导入所有节点和关系,然后在加载所有数据后运行查询以删除不必要的关系。

加载图形后,此查询应该适用于您。对于每个:给定关系的IS_FROM关系,它只保持与最高r_confidence的关系,并删除其他关系:

MATCH (e1:Entity1)-[r:IS_FROM]->(e2:Entity2)
WITH e1, r.relation as relation, COLLECT(r) as rels, MAX(r.r_confidence) as maxConfidence, e2
WHERE SIZE(rels) > 1
WITH FILTER(r in rels WHERE r.r_confidence <> maxConfidence) as toDelete
FOREACH (rel in toDelete | DELETE rel)

修改

如果你也需要摆脱重复的关系,那么一个应该更好的替代方法可能是通过置信度排序两个节点之间特定关系的关系,并删除除第一个之外的所有关系:

MATCH (e1:Entity1)-[r:IS_FROM]->(e2:Entity2)
WITH e1, r.relation as relation, r, e2
ORDER BY r.r_confidence DESC
// since we just sorted, the collection will be in order
WITH e1, relation, COLLECT(r) as rels, e2
// delete all other relationships except the top
FOREACH (rel in TAIL(rels) | DELETE rel)