【问题标题】:neo4j 2.0/Cypher: match nodes connected by 2 different relationsneo4j 2.0/Cypher:匹配由 2 个不同关系连接的节点
【发布时间】:2014-01-15 10:17:43
【问题描述】:

我有一个多图,节点之间有多种关系。我尝试创建一个 Cypher 查询,该查询返回由具有不同属性的两个关系连接的节点:

标签为Mirna 的节点通过REGULATES 关系连接到Gene。我想返回由两个REGULATES 连接的所有MirnaGene 节点以及source 属性first_dbsecond_db

这是我尝试过的:http://gist.neo4j.org/?4fddc897b30ef7aa4732

这可行,但对于大型数据集来说速度很慢。我猜是因为我一开始匹配太多:

MATCH (m:Mirna)-[r:REGULATES]->(g:Gene)
WITH m,g, collect(r.source) AS source    
WHERE 'first_db' IN source AND 'second_db' IN source
RETURN m,g

这执行得更快,并且对玩具数据给出相同的结果:

MATCH (m:Mirna)-[r:REGULATES { source: 'first_db' }]->(g:Gene),
      (m:Mirna)-[r2:REGULATES { source: 'second_db' }]->(g:Gene)
RETURN m,g,r,r2

但这安全吗?Cypher 是否总是明白我想要相同节点之间的两种关系?是否有另一种更有效/更优雅的方式来查询多个关系?

【问题讨论】:

  • 由于您使用相同的标识符 'm' 和 'g' 它应该是安全的,但也许一些小的调整会使查询更快(也许在第二次提及标识符时删除标签,也许将其表达为一种模式,即(a)-[r1]-(b)-[r2]-(a),尽管我不确定没有分析的区别)。这是一种确定性估计吗? IE。 “至少有两个权威人士说 x,所以 x 可能是真的”之类的东西?
  • 一种模式似乎更容易,我没想到。是的,这是一种确定性估计。如果两个数据源同意 Gene 受到监管,我的结论是它更真实;)
  • 作为一种模式在性能上有区别吗?在许多情况下,密码引擎可能会重构为引擎盖下最好的东西,所以也许没有区别(尽管看起来更好)。也许在生物学中有些事情“更真实”,但在我的领域,我们持怀疑态度;)我已经对 neo4j 进行了类似的“可能科学”使用,但数据却截然不同;很想喝杯咖啡,听听你的工作。
  • 第一步是比较未正确处理的数据源。我不会将其用作“严格”的估算器。生物学中许多数据集的问题:它们是稀疏的而且它们是错误的 :) 所以你坚持任何使它不那么错误的东西。就我而言,有趣的部分是有很多数据集,并且一些(新)数据集的错误率比旧数据集低。所以你也许可以过滤......你在做什么?咖啡听起来很棒。

标签: neo4j


【解决方案1】:

您的第一个查询过滤得太晚了,因此它无法包含在模式匹配中,这就是它速度较慢的原因(除了作为全局图形查询之外)。

MATCH (m:Mirna)-[r:REGULATES]->(g:Gene)
WHERE r.source = 'first_db' OR r.source = 'second_db'
WITH m,g, collect(r.source) AS source    
WHERE 'first_db' IN source AND 'second_db' IN source
RETURN m,g

如果没有误报,您也可以将其简化为:

MATCH (m:Mirna)-[r:REGULATES]->(g:Gene)
WHERE r.source = 'first_db' OR r.source = 'second_db'
WITH m,g, count(distint r.source) AS source    
WHERE source = 2
RETURN m,g

【讨论】:

  • 好主意,没有列表搜索。不幸的是,有 third_db ... nth_db :) 第二个查询执行得更好,但它有效吗?并不是说我不相信 Cypher 的魔法,但最好是安全的……;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多