我有一个mulitgraph,节点之间有多个关系。我尝试创建一个Cypher查询,返回由两个具有不同属性的关系连接的节点:
标签为Mirna
的节点与Gene
关联的REGULATES
连接。我想要返回由Mirna
个Gene
属性REGULATES
和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总是明白我想要相同节点之间的两个关系吗?是否有另一种更有效/更优雅的方式来查询多个关系?
答案 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