我试图找到节点之间的关系,其中包含可选但特定的节点/关系(neo4j 2.0 M6)。

在我的数据模型中,“基因”可以是“组”的“PARTOF”。我在“基因”-“基因”、“基因”-“组”和“组”-“组”之间有“交互”关系(模型图像中的红线)。

我想将其归结为“基因”之间的所有“交互”关系:都直接 (Gene-INTERACT-Gene) 并通过一两个“团体” (Gene-PARTOF-Group-INTERACT-Gene).


enter image description here


当然,使用多个 Cypher 查询这很容易:

# direct INTERACT
MATCH (g1:Gene)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via one Group
MATCH (g1:Gene)-[:PARTOF]-(gr:Group)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via two Group
MATCH (g1:Gene)-[:PARTOF]-(gr1:Group)-[r:INTERACT]-(gr2:Group)-[:PARTOF]-(g2:Gene)
RETURN g1, g2

但是是否有可能构建一个在路径中采用可选“组步骤”的 Cypher 查询?到目前为止,我只使用了可选关系和 shortestPaths, ,但我不知道是否可以过滤两个基因之间的一个或两个可选节点。

有帮助吗?

解决方案

您可以为添加到路径的每个关系指定介于 0 和 1 之间的深度。尝试类似的东西

MATCH (g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene) 
RETURN g1,g2

要查看匹配的路径实际上是什么样子,只需返回整个路径

MATCH p=(g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene) 
RETURN p

然而,为该模式的可选部分声明节点标签有点麻烦,因此该查询假设基因不属于除组之外的任何内容,并且它们仅与组和其他基因相互作用。如果一个基因可以有 [:PARTOF] 到别的东西,然后 (gr1) 将绑定该东西,并且查询不再可靠。只需添加一个 where 子句即可

WHERE gr1:Group AND gr2:Group

排除可选部分不匹配的情况,因此这不起作用(就像您的第三个查询一样)。我确信它可以解决,但如果您的实际模型并不比您在问题中描述的复杂得多,那么这应该可以解决。

我冒昧地在控制台中解释了你的模型 这里, ,检查一下它是否符合您的要求。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top