質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Neo4j

Neo4jとは繋がったデータに十分合うオープンソースな商グラフデータベースです。全てのJVM言語もしくはHTTP-APIsを通してその他の言語ドライバからも様々な用途で使えます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1398閲覧

Swift 用の Neo4j ドライバでデータ読込みが上手くいかない

退会済みユーザー

退会済みユーザー

総合スコア0

Neo4j

Neo4jとは繋がったデータに十分合うオープンソースな商グラフデータベースです。全てのJVM言語もしくはHTTP-APIsを通してその他の言語ドライバからも様々な用途で使えます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/03/06 13:00

編集2018/03/07 13:22

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/03/07 00:28 編集

「思った通りに動きません」←どう思っているのか書いて下さい。
guest

回答1

0

ベストアンサー

解決とは少し違いますが、REST API を使用することにしました。
見て頂いた方々ありがとうございました。
Neo4j REST API

投稿2018/03/09 10:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問