neo4j 2.0 / Cypher:匹配由2个不同关系连接的节点

时间:2014-01-14 21:55:16

标签: neo4j

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

标签为Mirna的节点与Gene关联的REGULATES连接。我想要返回由MirnaGene属性REGULATESsource连接的所有first_dbsecond_db个节点。

Graph schema

以下是我尝试的内容: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总是明白我想要相同节点之间的两个关系吗?是否有另一种更有效/更优雅的方式来查询多个关系?

1 个答案:

答案 0 :(得分:3)

你的第一个查询过滤太晚了,所以它不能包含在模式匹配中,这就是为什么它的速度较慢(除了是全局图形查询)。

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