Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
neo4j 2.0/Cypher:匹配由2个不同关系连接的节点_Neo4j - Fatal编程技术网

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

neo4j 2.0/Cypher:匹配由2个不同关系连接的节点,neo4j,Neo4j,我有一个多重图,节点之间有多重关系。我尝试进行一个Cypher查询,返回由两个具有不同属性的关系连接的节点: 带有标签Mirna的节点通过调节关系连接到基因。我想返回所有Mirna和基因节点,它们通过源属性第一个和第二个连接 以下是我尝试过的: 这是可行的,但对于大型数据集来说速度非常慢。我猜是因为我一开始匹配的太多了: MATCH (m:Mirna)-[r:REGULATES]->(g:Gene) WITH m,g, collect(r.source) AS source WH

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

带有标签
Mirna
的节点通过
调节关系连接到
基因
。我想返回所有
Mirna
基因
节点,它们通过
属性
第一个
第二个
连接

以下是我尝试过的:

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

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是否始终理解我希望相同节点之间存在两种关系?有没有其他更高效、更优雅的方法来查询多个关系?

您的第一个查询进行筛选太晚,因此无法包含在模式匹配中,这就是为什么它速度较慢(除了作为全局图查询之外)

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

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

由于您使用相同的标识符'm'和'g',因此应该是安全的,但可能一些小的调整会使查询更快(可能在第二次提到标识符时删除标签,可能将其表示为一种模式,即la
(a)-[r1]-(b)-[r2]-(a)
,尽管我不确定不进行分析时的区别)。这是一种确定性估计吗?例如,“至少有两位权威人士说x,所以x可能是真的”之类的东西?我没有想到一种模式似乎更简单。是的,这是一种确定性估计。如果两个数据源一致认为基因受调控,我的结论是更正确;)作为一种模式,性能是否存在差异?在许多情况下,cypher引擎可能会重构为引擎罩下最好的引擎,因此可能没有什么区别(尽管看起来更好)。也许在生物学中有些事情“更真实”,但在我的领域中,我们持怀疑态度;)我对neo4j进行了类似的“可能科学”使用,但数据非常不同;我想找个时间喝杯咖啡,听听你的工作。第一步是比较数据来源,这还没有得到正确的解决。我不会用它作为“严格”的估计。生物学中许多数据集的问题:它们是稀疏的,而且它们是错误的:)所以你坚持使用任何能让它稍微不那么错误的数据集。在我的例子中,有趣的是有很多数据集,一些(新的)数据集的错误率比旧的数据集低。所以你可以过滤。。。你在做什么?咖啡听起来不错。好主意,不用搜索列表。不幸的是,还有第三个。。。第二个查询执行得更好,但它能工作吗?并不是说我不相信密码的魔力,而是最好是安全的…;)
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