【发布时间】:2014-01-15 10:17:43
【问题描述】:
我有一个多图,节点之间有多种关系。我尝试创建一个 Cypher 查询,该查询返回由具有不同属性的两个关系连接的节点:
标签为Mirna 的节点通过REGULATES 关系连接到Gene。我想返回由两个REGULATES 连接的所有Mirna 和Gene 节点以及source 属性first_db 和second_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