【问题标题】:Neo4j: results are duplicatedNeo4j:结果重复
【发布时间】:2018-10-11 19:22:03
【问题描述】:

所以我试图找到每个节点至少与另一个节点有一个公共节点。这是我用来执行此操作的请求:

MATCH (source:Article)--(neighbor)--(target:Article)
WHERE NOT (source.unique_url) = (target.unique_url)
WITH DISTINCT [source.unique_url, target.unique_url] AS combo, 
     source, target, neighbor 
RETURN combo, 
       source.unique_url AS source_unique_url, 
       source.title AS source_title, 
       source.url AS source_url, 
       target.unique_url AS target_unique_url, target._id AS target_id,
       target.title AS target_title,  
       count(neighbor) AS common_neighbors
ORDER BY common_neighbors DESCENDING

但遗憾的是,[source.unique_url, target.unique_url] 总是重复的,就像一个节点与另一个节点有共同的邻居,我总是得到这样的结果:

[url1, url2]
[url2, url1]
[url1, url2]
[url2, url1]

我检查了数据库中的数据没有重复,所以请求正在复制它们,有人知道可能是什么原因造成的吗? 非常感谢!

【问题讨论】:

  • 我认为您需要提供一个输入数据示例,以验证您的查询。
  • @stdob-- 我怎样才能轻松做到这一点?就像数据库的导出或纯文本示例
  • 由于您的 MATCH 模式是对称的,因此每个匹配对将至少获得 2 行,只需将位置切换为 sourcetarget。虽然节点 id 上的不等式应该解决这个问题(WHERE id(source) < id(target) 替换您的第二行),但您的回报不是对称的。你有什么理由返回target_id而不是源的ID?
  • @InverseFalcon 不是真的,我可以返回我想要的任何东西,id 更多的是用于调试目的。我试着按照你说的替换第二行,现在我有了:[url1, url2] [url1, url2] 更好,但仍然不完美
  • 您可能需要仔细检查您的数据库中是否存在具有相同 unique_url 属性的重复节点。尝试在 :Article(unique_url) 上创建一个唯一约束,看看它是否完成且没有错误。如果不是,则该属性不是唯一的,您可能需要进行一些清理工作。

标签: neo4j graph-databases bolt


【解决方案1】:

尝试像这样更改查询的开头。

  1. 为关系添加方向
  2. 添加 id(源)> id(目标)
MATCH (source:Article)-->(neighbor<)--(target:Article)
WHERE id(source) > id(target)
WITH ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多