在 Swift 中使用 Neo4j Rest API

Working with Neo4j Rest API in Swift

我对 iOS 和 Swift 很陌生,现在我想使用 Neo4j,这是一个图形数据库,用于持久保存我的数据。 我知道有一个名为 Theo 的库用于连接图形数据库,但我想使用 REST API。现在我不确定如何处理 HTTP 请求以便从数据库获取数据到我用 Swift 编写的 iOS-应用程序? 有人能给我一些有用的线索吗?

谢谢汉内斯

您提到的 Theo library 是 Neo4j REST API 的包装器。使用这样一个库的好处是它可以处理 JSON 序列化、错误处理、将正确的 headers 添加到 HTTP 请求等

您可以将 Cypher 与 transactional Cypher REST API endpoint using Swift like this (Note: this uses the Alamofire 库一起使用来处理 HTTP 请求。):

import Alamofire

let cypherStatement = "CREATE (:Person {name: 'Bob'})-[:LIKES]->(pizza:Food {type: 'Pizza'})<-[:LIKES]-(:Person {name: 'William'}) WITH pizza MATCH (p:Person)-[:LIKES]->(pizz) RETURN p.name AS name"  
let endpoint = "http://localhost:7474/db/data/transaction/commit"
let requestBody = [
        "statements": [
            [
                "statement": cypherStatement
            ]
        ]
    ]
Alamofire.request(.POST, endpoint, parameters: requestBody, encoding: .JSON)
        .responseJSON { response in
            debugPrint(response)
    }

记录:

[Request]: <NSMutableURLRequest: 0x7fafcb637320> { URL:     http://localhost:7474/db/data/transaction/commit }
[Response]: <NSHTTPURLResponse: 0x7fafcb81d480> { URL: http://localhost:7474/db/data/transaction/commit } { status code: 200, headers {
"Access-Control-Allow-Origin" = "*";
"Content-Length" = 91;
"Content-Type" = "application/json";
Date = "Fri, 18 Dec 2015 19:29:41 GMT";
Server = "Jetty(9.2.z-SNAPSHOT)";
} }
[Data]: 91 bytes
[Result]: SUCCESS: {
    errors =     (
    );
    results =     (
                {
            columns =             (
                name
            );
            data =             (
                                {
                    row =                     (
                        Bob
                    );
                },
                            {
                    row =                     (
                        William
                    );
                }
            );
        }
    );
}

编辑

不使用 Alamofire 发出相同的请求将如下所示:

let cypherStatement = "CREATE (:Person {name: 'Bob'})-[:LIKES]->(pizza:Food {type: 'Pizza'})<-[:LIKES]-(:Person {name: 'William'}) WITH pizza MATCH (p:Person)-[:LIKES]->(pizz) RETURN p.name AS name"  
let endpoint = "http://localhost:7474/db/data/transaction/commit"
let requestBody = [
        "statements": [
            [
                "statement": cypherStatement
            ]
        ]
    ]

guard let url = NSURL(string: endpoint) else {
            print("Error")
            return true
        }

        let request = NSMutableURLRequest(URL: url)
        request.HTTPMethod = "POST"
        request.addValue("application/json",forHTTPHeaderField: "Content-Type")
        request.addValue("application/json",forHTTPHeaderField: "Accept")

        do{
            let jsonData = try NSJSONSerialization.dataWithJSONObject(requestBody, options: .PrettyPrinted)
            request.HTTPBody = jsonData

            let config = NSURLSessionConfiguration.defaultSessionConfiguration()
            let session = NSURLSession(configuration: config)

            let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) in
                let result: NSDictionary
                do {
                    result = try NSJSONSerialization.JSONObjectWithData(data!,
                        options: []) as! NSDictionary
                } catch  {
                    print("error trying to convert data to JSON")
                    return
                }
                print("\(result)")
            })
            task.resume()
        } catch let error as NSError {
            print("JSON serialization error")
            return true
        }