【问题标题】:neo4j: optional 'steps' in Cypher queryneo4j:Cypher 查询中的可选“步骤”
【发布时间】:2013-11-15 12:41:26
【问题描述】:

我正在尝试查找具有可选但特定节点/关系的节点之间的关系(neo4j 2.0 M6)。

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

我想将其归结为“基因”之间的所有“交互”关系:直接(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,但我不知道是否可以在两个基因之间过滤一两个可选节点。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您可以为添加到路径的每个关系指定介于 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
    

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

    我冒昧地在控制台 here 中解释了您的模型,请检查它是否符合您的要求。

    【讨论】:

    • 你的基因+10!这似乎奏效了。不过现在是星期五下午,我不相信自己。现实生活中的数据更复杂,但我认为我可以通过过滤对 Gene 和 Group 都适用的属性来处理 gr1/gr2 问题。
    • 我有点不明白这是如何匹配 'Gene-PARTOF-Group-INTERACTS-Group-PARTOF-Gene' 因为最后一步是 INTERACT...
    • 你说得对,现在是星期五下午(这与这种情况不符)。中间的[INTERACT]不应该是可选的,最后一个关系应该是[PARTOF*0..1],我认为
    • 这看起来更好,但我必须检查一下。我认为为了使它起作用,Cypher 需要弄清楚哪些节点是可选的,即 g1 的 opt1 右侧和 g2 的 opt2 左侧。见这里:console.neo4j.org/r/om2nxt
    • 更准确地说,如果 g1 和 opt1/gr1 之间没有 PARTOF,它将“使用”g1 作为 opt1/gr1。我不明白 Cypher 是如何计算的?
    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多