Go 如果关系不';不存在

Go 如果关系不';不存在,go,neo4j,neoism,Go,Neo4j,Neoism,到目前为止,我才刚刚开始使用新教并享受它。我碰到了一个小问题,想知道是我对新教的天真还是新教本身的错 我的go代码中有一行: agent.Relate(relation, node.Id() , neoism.Props{}) 问题是,如果我多次运行它,它将复制关系。是否有一种仅在关系不存在时创建的方法—类似于GetOrCreateNodeFunction 或者在运行上面的语句之前,我必须编写一些原始cql来检查关系是否已经存在 提前感谢没有用于创建唯一定向关系的本机函数或REST端点。您可以

到目前为止,我才刚刚开始使用新教并享受它。我碰到了一个小问题,想知道是我对新教的天真还是新教本身的错

我的go代码中有一行:

agent.Relate(relation, node.Id() , neoism.Props{})
问题是,如果我多次运行它,它将复制关系。是否有一种仅在关系不存在时创建的方法—类似于GetOrCreateNodeFunction

或者在运行上面的语句之前,我必须编写一些原始cql来检查关系是否已经存在


提前感谢

没有用于创建唯一定向关系的本机函数或REST端点。您可以为每个关系指定一个唯一的属性值,并在关系属性上添加一个唯一的索引,也可以使用cypher查询和CREATE unique子句


没有用于创建唯一定向关系的本机函数或REST端点。您可以为每个关系指定一个唯一的属性值,并在关系属性上添加一个唯一的索引,也可以使用cypher查询和CREATE unique子句


您可以使用我在代码中使用的以下函数。它至少有一个外部依赖项

github.com/imdario/mergo

以下通用函数适用于任何类型的节点和关系

 func GetOrCreateRelationship(from *neoism.Node, to *neoism.Node, relType string, props neoism.Props) (relationship *neoism.Relationship) {
relationships, err := from.Relationships(relType)

if err == nil {
    for _, relationship := range relationships {
        endNode, err := relationship.End()

        if err != nil {
            continue
        }

        if endNode.Id() == to.Id() {
            newProps, err := relationship.Properties()

            if err != nil {
                return relationship
            }

            if err := mergo.Merge(&newProps, props); err != nil {
                relationship.SetProperties(newProps)
            }

            return relationship
        }
    }
}

relationship, err = from.Relate(relType, to.Id(), props)

if err != nil {
    log.Printf("Cannot create relationship: %s", err)
}

return
}

您可以使用下面的函数,我将其用于我的代码。它至少有一个外部依赖项

github.com/imdario/mergo

以下通用函数适用于任何类型的节点和关系

 func GetOrCreateRelationship(from *neoism.Node, to *neoism.Node, relType string, props neoism.Props) (relationship *neoism.Relationship) {
relationships, err := from.Relationships(relType)

if err == nil {
    for _, relationship := range relationships {
        endNode, err := relationship.End()

        if err != nil {
            continue
        }

        if endNode.Id() == to.Id() {
            newProps, err := relationship.Properties()

            if err != nil {
                return relationship
            }

            if err := mergo.Merge(&newProps, props); err != nil {
                relationship.SetProperties(newProps)
            }

            return relationship
        }
    }
}

relationship, err = from.Relate(relType, to.Id(), props)

if err != nil {
    log.Printf("Cannot create relationship: %s", err)
}

return
}

谢谢你的回复。我最后就是这么做的——创建一个cypher语句并通过neoism.query运行它。谢谢您的回复。我最终就是这么做的——创建一个cypher语句并通过neoism.query运行它。