Cypher返回重复的结果

时间:2018-03-04 17:29:46

标签: neo4j cypher

创建此查询以返回访问过的URL的统计信息。但不幸的是,大多数时候我得到了不必要的结果。例如,如果链接有80次访问(80个VISIT节点),则结果数组中将包含超过650个项目。

这是查询:

'MATCH (l:URL { id: $id })<-[:CREATED]-(u:USER { email: $email }) ' +
`${domain ? 'MATCH (l)-[:USES]->(domain { name: $domain })' : ''}` +
'MATCH (v)-[:VISITED]->(l) ' +
'MATCH (v)-[:BROWSED_BY]->(b) ' +
'MATCH (v)-[:LOCATED_IN]->(c) ' +
'MATCH (v)-[:OS]->(o) ' +
'MATCH (v)-[:REFERRED_BY]->(r) ' +
'MATCH (v)-[:VISITED_IN]->(d) ' +
'RETURN l, b.browser AS browser, c.country AS country,' +
`${domain ? 'domain.name AS domain, ' : ''}` +
'o.os AS os, r.referrer AS referrer, d.date AS date ' +
'ORDER BY d.date DESC'

该项目也是开源的,因此可以在此处找到完整的查询代码: https://github.com/thedevs-network/kutt/blob/a1d9796c7f5573c590752a1bd635f445e4a971b7/server/db/url.js#L339-L350

1 个答案:

答案 0 :(得分:0)

请注意,除非匹配中的每个节点都有一个,否则您将获得乘法结果,因为在找到的节点之间形成了交叉乘积。

您可能希望查看结果并确定多个结果的发生位置。

通过聚合查询中的大多数其他节点,您可以测试每个访问节点的多个关联节点的一种方法:

'MATCH (l:URL { id: $id })<-[:CREATED]-(u:USER { email: $email }) ' +
`${domain ? 'MATCH (l)-[:USES]->(domain { name: $domain })' : ''}` +
'MATCH (v)-[:VISITED]->(l) ' +
'MATCH (v)-[:VISITED_IN]->(d) ' +
'WITH l, v, u, `${domain ? 'domain, ' : ''}` ' +
'[(v)-[:BROWSED_BY]->(b) | b.browser] as browser ' +
'[(v)-[:LOCATED_IN]->(c) | c.country] as country ' +
'[(v)-[:OS]->(o) | o.os] as os ' +
'[(v)-[:REFERRED_BY]->(r) | r.referrer] as referrer ' +
'd.date as date ' +
'RETURN l, browser, country,' +
`${domain ? 'domain.name AS domain, ' : ''}` +
'os, referrer, date ' +
'ORDER BY date DESC'

查看结果数量是否发生变化。查找具有多个值的列表。或类似的结果多次发生但在不同的日期发生。

修改

现在您已确认存在重复,我们需要查明这是否是因为重复的节点或重复的关系。

这很可能是由于重复的关系造成的。您可以查看:

MATCH (v:VISIT)
WITH v, size((v)-[:OS]->()) as OS_count
RETURN count(v)

您可以根据需要进行修改,以实际获取具有多个:OS关系的节点,或检查其他重复关系。