我试图计算两个节点之间的关系数量,这些关系重复了一次以上。因为我正在使用MERGE
条款。那么,是否有可能计算关系重复是否超过一次。图形上我看不到因为在使用MERGE
子句时,如果节点和关系相同,则所有关系都会合并。但在我的数据重复确实存在。例如,如果节点A
调用节点B
,则此调用关系超过10次。当我将使用MERGE
子句时,它只会出现一次,这有利于避免图中的重复。但我可以用cypher查询计算这些重复吗?提前致谢
如果你有(a)-[:CALLS]->(b)
那么计算a和b之间的CALLS关系数的方法就是
MATCH (a)-[r:CALLS]->(b)
RETURN COUNT(r)
但是,你也说你使用MERGE
,它只能在a和b之间创建一个CALLS
关系。
如果您确定a和b之间存在多个CALLS
关系,则MERGE
的使用不正确,或者在您开始使用MERGE
之前存在这些关系。
无论哪种方式,如果存在多个,则Neo4j浏览器(2.2之后)将显示a和b之间的良好弯曲关系,并且上述查询将确认该事实。
如果要获取重复的关系,可以使用此查询:
MATCH (a)-[r]->(b)
WITH
a, b, type(r) as typer, count(r) as countr
WHERE
countr>1
RETURN
a, b, typer, countr
例如,如果您有这些数据:
约翰 - 打电话 - >莎莉
约翰 - 打电话 - >莎莉
莎拉 - 打电话 - >汤姆
艾米 - 打电话 - >莉莉
艾米 - 打电话 - >莉莉
艾米 - 打电话 - >莉莉
该查询将返回:
a b typer countr
John Sally calls 2
Amy Lily calls 3
我使用以下内容的变体来审查重复的关系:
MATCH
(a)-[r]->(b)
WITH
id(a) AS id_a, id(b) AS id_b, type(r) AS type_r, count(*) AS count_r
WHERE
count_r > 1
RETURN
type_r, count_r
LIMIT 10
你需要小心,因为它们也可能是有效的,因为它们可能包含其中包含的不同属性值。但是,正如您所解释的那样,在创建时使用MERGE,您不应该获得重复项。您是否可以确保使用正确的MERGE语句,该语句要求关系独立于属于该关系的节点中的任何新值或更改值进行合并。您可能希望发布代码示例以便正确查看。