【问题标题】:Cypher query for gremlin traversalgremlin 遍历的密码查询
【发布时间】:2021-10-26 15:27:29
【问题描述】:

密码查询新手

g.V().has('Entity1','id',within(id1)).in('Entity2').
where(__.out('Entity3').where(__.out('Entity4').has('name',within(name))))

如何将上述 gremlin 转换为 cypher 并返回相邻的 Entity2 invertex。

这里的条件是 out('Entity3') 应该在 Entity2 之外 out('Entity4') 应该不在提供的值列表中的 Entity3 和名称

返回inEntity2的相邻顶点

【问题讨论】:

    标签: cypher gremlin


    【解决方案1】:

    直接回答:

    MATCH (m:Entity1 )<-[:Entity2]-(n) 
    WHERE (n)-[:Entity3]->()-[:Entity4]->({name: "ABC"}) 
           AND m.id in ["id1"]
    RETURN n
    
    # Assuming id is a property here. 
    
    # If id is the actual ID of the node
    
    MATCH (m:Entity1 )<-[:Entity2]-(n) 
    WHERE (n)-[:Entity3]->()-[:Entity4]->({name: "ABC"}) 
           AND ID(m) in ["id1"]
    RETURN n
    
    

    我尝试使用此查询为您的用例创建图表:

    CREATE (a:Entity2)-[:Entity2]->(b:Entity1 {id:"id1"}), 
        (a)-[:Entity3]->(:Entity3)-[:Entity4]->(:Entity4 {name:"ABC"})
    

    图表如下所示:

    但是,我认为在编写 gremlin 遍历时,您的意图是指定顶点的标签而不是边的标签。这就是为什么在我编写的用于创建图形、关系和顶点的查询中,关系指向具有相同的标签。

    如果这是您的意图,那么您的密码查询应该是这样的。

    MATCH (:Entity1 {id:"id1"})<--(n:Entity2) 
    WHERE (n)-->(:Entity3)-->(:Entity4 {name: "ABC"})
    RETURN n
    
    

    【讨论】:

    • MATCH (:Entity1 {id:"id1"}) id 必须与 gremlin 中的值列表进行比较,因此在使用的 {id:"id1"} 中不起作用。
    • 我刚刚更新了查询以使用 IN 模式而不是直接模式匹配来匹配 ID。看看,让我知道这是否适合你。
    • 错过了第一篇文章并更新了 where(__.out('Entity4').has('name',within(name))) 。我们如何为 entity4 的出顶点添加条件
    • MATCH (m:Entity1 )&lt;-[:Entity2]-(n)-[:Entity3]-&gt;()-[:Entity4]-&gt;(o) WHERE m.id in ["id1"] AND o.name in ["ABC"] RETURN n
    【解决方案2】:

    我不能 100% 确定您在寻找什么,因为与描述相比,上面的 Gremlin 似乎不完整,但我认为您正在寻找的是这样的:

    MATCH (e1:Entity1)<-[:Entity2]-(e2)-[:Entity3]->(e3)-[:Entity4]->(e4 {code: 'LHR'})
    WHERE e1 IN (id1)
    RETURN e2
    

    【讨论】:

    • 想要返回 Entity2 类型的连接边的顶点,该顶点必须在 Entity3 和 Entity3 之外,在 Entity4 和 Entity4.name 值列表中
    • 下面的查询语法错误,寻找类似的东西 MATCH (entity1:Entity1) WHERE entity1.id IN ['id'] AND (entity1)(out_Entity3) AND (out_Entity3)-[:Entity4]->(out_Entity4) MATCH out_Entity4 WHERE out_Entity4.id IN ['name'] RETURN in_Entity2
    最近更新 更多