【问题标题】:Is there an API to retrieve the neo4j relationship details using the Go bolt driver?是否有使用 Go 螺栓驱动程序检索 neo4j 关系详细信息的 API?
【发布时间】:2021-09-28 06:01:20
【问题描述】:

使用 neo4j Go 螺栓驱动程序,我能够从图形数据库中获取节点,但不能获取关系。

neo4j.transaction 中的Run() API 返回类型是Result,它可以给节点,但不能给关系?

如果我在 neo4j 浏览器中尝试查询,它会显示关系的属性,但如果我以编程方式发送相同的查询,我什么也得不到。我错过了什么吗?

MATCH (:a {name: ‘foo’})-[r:bar]->() RETURN properties(r)

上述查询有效

{
  "X":"20",
  "Y":"40"
} 

但是通过驱动程序发送的相同查询没有返回错误,但其中没有任何内容。

【问题讨论】:

    标签: go neo4j


    【解决方案1】:

    您的映射代码可能有问题。 它应该是这样的:

    func readCoordinates(driver neo4j.Driver) ([]Coordinates, error) {
        session := driver.NewSession(neo4j.SessionConfig{})
        defer session.Close()
        result, err := session.ReadTransaction(executeReadCoordinates)
        if err != nil {
            return nil, err
        }
        return result.([]Coordinates), nil
    }
    
    func executeReadCoordinates(tx neo4j.Transaction) (interface{}, error) {
        records, err := tx.Run("MATCH (:A {name: 'foo'})-[r:BAR]->() RETURN properties(r)", map[string]interface{}{})
        if err != nil {
            return nil, err
        }
        var results []Coordinates
        for records.Next() {
            record := records.Record()
            if props, found := record.Get("properties(r)"); !found {
                return nil, fmt.Errorf("expected properties not found")
            } else {
                properties := props.(map[string]interface{})
                coordinates := Coordinates{
                    X: properties["x"].(int64),
                    Y: properties["y"].(int64),
                }
                results = append(results, coordinates)
            }
        }
        return results, nil
    }
    

    我更改了节点标签(约定:PascalCase)、关系类型(约定:SCREAMING_SNAKE_CASE)和属性(约定:snake_case)的大小写。

    代码假定这些属性的类型为int64 并获取一个列表。 如果您想要一对坐标,请删除 for 循环并改用 records.Single()

    【讨论】:

    • 谢谢!我对类型断言有疑问。您的代码很有帮助。
    • 不客气,乐于助人。随意接受答案;)
    最近更新 更多