我试图找到节点之间的关系,其间有可选但特定的节点/关系(neo4j 2.0 M6)。
在我的数据模型中,'Gene'可以是'PARTOF'''组。我在'Gene' - 'Gene','Gene' - 'Group'和'Group' - 'Group'(模型图片中的红线)之间有'INTERACT'关系。
我希望将其归结为'基因'之间的所有'交互'关系:直接(Gene-INTERACT-Gene)
和通过一个或两个'群组'(Gene-PARTOF-Group-INTERACT-Gene)
。
当然,对于多个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 :(得分:2)
您可以为添加到路径的每个关系指定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 gr1:Group AND gr2:Group
排除了可选部分不匹配的情况,因此不起作用(它就像您的第三个查询)。我相信它可以解决,但如果你的实际模型并不比你在问题中描述的那么复杂,那就应该这样。
我冒昧地在控制台here中解释您的模型,检查它是否符合您的要求。