Neo4jのSwift用ドライバを使用してNeo4jデータの操作をしたいです。
データの作成はできるのですが、Nodeの読込みが上手くいきません。
環境
全ソースコード: https://github.com/yoshimn/Neo4jData.git
neo4j driver: https://github.com/Neo4j-Swift/Neo4j-Swift
macOS: 10.13.3
Swift: 4.0.3
Neo4j: 3.3.0
Xcode: 9.2
私が作成したソースコードのテスト用ファイル Neo4jDataTests.swift で、
テスト用関数 'testCreate', 'testDelete', 'testMatch' を作成して動かしてみました。
期待している結果はそれぞれ次になります。
== == == == == == == == == == == == == ==
testCreate:
Person ラベル、name プロパティを持つデータを5個(5人分)Neo4jに作成する。
ただし、繰り返し実行すればその分データは増える。
testDelete:
Person ラベルのデータを全てNeo4jから削除する。
testMatch:
Person ラベルのデータをNeo4jから取得する。
== == == == == == == == == == == == == ==
しかし、実際の結果は次のようになってしまいます。
== == == == == == == == == == == == == ==
testCreate:
OK
testDelete:
データが全く削除されない。エラーも起きない。
testMatch:
データ1個しか取得できない。エラーも起きない。
== == == == == == == == == == == == == ==
【調べた事】
使用している Neo4j driver は依存パッケージとして Bolt というライブラリを読み込んでいて、
①Cypher query を Neo4j に Request した結果をバイナリ配列で一旦受け取り、
②それを Neo4j のラベルやプロパティ といった構造体に変換して実行結果としているようです。
そのソースコードや実行時の動きを確認すると、例えば testMatch であれば、
①での5人分のデータ自体は取得できているように思いました。
一人分ずつデータを作成してバイナリ配列を比較してみましたが、比例して要素数が増えていて、
共通部分や、新規データ分と考えられる要素の並びが存在したからです。
②ではバイナリ配列の要素をチェックしてデータタイプやデータサイズを調べていますが、
これが上手く行ってない気がしています。(Bolt ライブラリの Connection.swift - request 関数)
ただバイナリの扱いが良く分からず質問させて頂いた次第です。
一応ソースコードは下記になるのですが、原因が分かる方がいたら教えて頂けないでしょうか。
Swift
1public final class Neo4jDataCore { 2 3 private var hostname: String = "localhost" 4 private var username: String = "neo4j" 5 private var password: String = "9999" 6 private var label: String = "Person" 7 8 lazy var client = try BoltClient(hostname: self.hostname, 9 username: self.username, 10 password: self.password) 11 12 public init() throws {} 13 public func run() throws {} 14 15} 16 17extension Neo4jDataCore { 18 19 func createNodes(_ people: [String]) { 20 let result = client.connectSync() 21 switch result { 22 case .failure(_): return 23 case .success(_): 24 defer { client.disconnect() } 25 let nodes = people.map{ Node(label: label, properties: ["name": $0]) } 26 let createResult = client.createAndReturnNodesSync(nodes: nodes) 27 switch createResult { 28 case .failure(_): return 29 case .success(_): print("Node saved successfully") 30 } 31 } 32 } 33 34 func deleteNodes() { 35 let result = client.connectSync() 36 switch result { 37 case .failure(_): return 38 case .success(_): 39 defer { client.disconnect() } 40 client.nodesWith(label: label){ [weak self] searchResult in 41 guard let nodes = searchResult.value, nodes.count > 0 else { return } 42 let deleteResult = self!.client.deleteNodesSync(nodes: nodes) 43 switch deleteResult { 44 case .failure(_): break 45 case .success(_): print("delete nodes") 46 } 47 } 48 } 49 } 50 51 func matchNodes() -> [Node]? { 52 let result = client.connectSync() 53 switch result { 54 case .failure(_): return nil 55 case .success(_): 56 defer { client.disconnect() } 57 let executeResult = client.executeCypherSync("MATCH (n:(label)) RETURN n") 58 switch executeResult { 59 case .failure(_): return nil 60 case let .success(queryResult): return queryResult.nodes.values.map{ $0 } 61 } 62 } 63 } 64 65}

回答1件
あなたの回答
tips
プレビュー