問題タブ [spring-data-neo4j]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
spring - Spring Data Neo4j の単純なオブジェクト/グラフ マッピングを使用してトランザクションを取得する正しい方法は?
私は、Spring Data Neo4j 2.0 で単純なオブジェクト/グラフ マッピングを使用しています。ここでは、Spring Data リポジトリ フレームワークを使用して永続化操作を実行しています。Neo4jTemplate を使用するのではなく、リポジトリを使用しています。リポジトリを Spring Web MVC コントローラーに挿入すると、コントローラーはリポジトリを直接呼び出します。(中間サービス層はありません。私の操作は通常、CRUD とファインダー クエリです。)
読み取り操作を行う場合、問題はありません。しかし、書き込み操作を行うと、「NotInTransactionException」が発生します。私の理解では、Neo4j の読み取り操作はトランザクションを必要としませんが、書き込み操作は必要です。
単純な OGM に固執したい場合、ここで取引を把握するための最良の方法は何ですか? @Transactional を使用したいのですが、それをさまざまなリポジトリ インターフェイスに配置してもうまくいきません。コントローラーとリポジトリーの間に中間サービス層を導入し、サービス Bean に @Transactional のアノテーションを付けるとうまくいきますが、もっと簡単な方法はないかと考えています。Spring Data がなければ、通常は DAO (リポジトリ) 実装にアクセスできるため、パススルー サービス層を回避したい場合は、具体的な DAO に @Transactional でアノテーションを付けることができます。Spring Data では、リポジトリが動的に生成されるため、それはオプションではないようです。
neo4j - Neo4j/Spring-Dataでの遅延/熱心な読み込み/フェッチ
私は簡単なセットアップをしていて、不可解な(少なくとも私にとっては)問題に遭遇しました:
互いに関連する3つのpojoがあります。
したがって、「現在のユニット」に直接ジャンプできるユーザーをマークする「現在のユニット」を持つUser-Worker-Unitがあります。各ユーザーは複数のワーカーを持つことができますが、1つのワーカーは1つのユニットにのみ割り当てられます(1つのユニットは複数のワーカーを持つことができます)。
私が疑問に思っていたのは、「User.worker」の@Fetchアノテーションを制御する方法です。私はほとんどの場合「Worker」でしか作業しないので、実際には必要なときにだけこれをロードしたいと思っています。
http://static.springsource.org/spring-data/data-neo4j/docs/2.0.0.RELEASE/reference/html/を確認しましたが、はっきりしていません。
- ワーカーは読み取り専用(着信関係)である必要があるため、反復可能です。ドキュメントではこれが明確に示されていますが、例では「セット」がほとんどの場合に使用されます。なんで?またはそれは重要ではありません...
- ワーカーにアクセス時にのみロードさせるにはどうすればよいですか?(遅延読み込み)
- 単純な関係(worker.unit)でさえ@Fetchでアノテーションを付ける必要があるのはなぜですか。もっと良い方法はありませんか?このような単純な関係が多数ある別のエンティティがあります。1つのオブジェクトのプロパティが必要であるという理由だけで、グラフ全体をロードする必要はありません。
- 遅延読み込みで動作するように、スプリング構成が欠落していますか?
- 追加の呼び出しを介して関係(@Fetchとしてマークされていない)をロードする方法はありますか?
私の見方からすると、このコンストラクトは、ほとんどの場合ユーザーを気にしない場合でも、ワーカーが必要になるとすぐにデータベース全体をロードします。
私が見つけた唯一の回避策は、リポジトリを使用し、必要に応じてエンティティを手動でロードすることです。
- - - - アップデート - - - -
私はかなり前からneo4jを使用していて、フェッチを常に呼び出す必要がない(したがって、グラフ全体をロードしない)上記の問題の解決策を見つけました。唯一の欠点:それは実行時の側面です:
アスペクトを適用するクラスパスmy.model.packageを調整する必要があります。.get()) ")
モデルクラスのすべてのgetメソッドにアスペクトを適用します。これには、いくつかの前提条件が必要です。
- モデルクラスでゲッターを使用する必要があります(アスペクトはパブリック属性では機能しません-とにかく使用しないでください)
- すべてのモデルクラスは同じパッケージに含まれています(コードを少し調整する必要があります)-フィルターを調整できると思います
- ランタイムコンポーネントとしてのaspectjが必要です(tomcatを使用する場合は少し注意が必要です)-しかし、それは機能します:)
すべてのモデルクラスは、以下を提供するBaseObjectインターフェイスを実装する必要があります。
public interface BaseObject {public boolean isFetched(); }
これにより、ダブルフェッチが防止されます。必須のサブクラスまたは属性(つまり、名前またはnodeId以外のもの)をチェックして、実際にフェッチされているかどうかを確認します。Neo4jはオブジェクトを作成しますが、nodeIdを埋めるだけで、他のすべては変更されません(したがって、他のすべてはNULLになります)。
すなわち
誰かがその奇妙な回避策なしでこれを行う方法を見つけた場合は、あなたの解決策を追加してください:)これは機能するので、私はaspectjのないものが大好きです。
カスタムフィールドチェックを必要としないベースオブジェクトデザイン
最適化の1つは、ブールフィールド(ブールロード)を実際に使用してそれをチェックするインターフェイスの代わりに基本クラスを作成することです(手動チェックについて心配する必要はありません)。
これが機能するのは、オブジェクトを保存すると、ロード時に「true」が返されるためです。アスペクトがオブジェクトを見るとき、isFetched()を使用します。これは、オブジェクトがまだ取得されていない場合、nullを返します。オブジェクトが取得されると、setLoadedが呼び出され、ロードされた変数がtrueに設定されます。
ジャクソンが遅延読み込みをトリガーするのを防ぐ方法は?
(コメントの質問への回答として-この問題がなかったので、まだ試していなかったことに注意してください)。
jacksonでは、カスタムシリアライザーを使用することをお勧めします(つまり、http: //www.baeldung.com/jackson-custom-serializationを参照)。これにより、値を取得する前にエンティティを確認できます。すでにフェッチされているかどうかをチェックし、シリアル化全体を続行するか、IDを使用するだけです。
スプリング構成
これは私が使用しているSpring構成のサンプルです。プロジェクトに合わせてパッケージを調整する必要があります。
AOP構成
これは、これが機能するための/META-INF/aop.xmlです。
nosql - HibernateのようなNeo4Jでクエリをログに記録する方法はありますか?
だから、ここにシナリオがあります:
- Neo4Jサーバーをローカルで実行していて、データが含まれています
- を使用しているWebアプリがあります
spring-data-neo4j
次のコードは、サンプルコードCineastsに基づいています。
ここにニュースはありません。問題は、クエリfindByNameLike
が機能しないのに対し、機能するfindByThinker
ことです。
ログ構成ファイルを何度も変更しました-最終バージョンは以下のものです-しかし、何を試しても、ログファイルまたはサーバーのいずれかにログに記録されているクエリを確認できません。
クエリをログに記録するだけで、バグspring-data-neo4j
かどうか、または何かが足りないかどうかを確認できます...両方のコード例のドキュメントを調べましたが、具体的なものは見つかりませんでした。
何か助けはありますか?ありがとうございました!
neo4j - persist() は常に新しいノードを作成します
SDN 2.0.0.RELEASE および Neo4j 1.5 でのインデックス作成/永続化に問題があります。
基本的に次のようなドメインクラス「Word」があります。
私はこの方法で単語を永続化しています:
単語が既にグラフにあるかどうかを確認することになっています。そうであれば、wordRepository によって返されたオブジェクトのいくつかの属性を変更し、変更を永続化します (-> if (existingWord != null))。単語がまだグラフに含まれていない場合は、永続化されます (-> else)。
ただし、これにより、グラフに存在する場合でも、常にすべての単語に対して新しいノードが作成されます。つまり、persist() は常に新しいノードを作成します。グラフに同じ wordString を持つ 2 つの単語があると、リポジトリ メソッドは次をスローします。
どうしたの?
また、IndexType.SIMPLE,IndexType.POINT と IndexType.FULLTEXT の違いは何だろうと思っています。(API や Good Relations ガイドにはありません)
data-modeling - データモデルのオンラインツールを見つける...写真から
Spring Data Neo4j のドキュメントを読んだところ、次のような写真が見つかりました。
とても面白いので私も使ってみたいです!それを生成するウェブサイトが何であるか知っていますか?いくつかのスクリプト言語で動作することは知っていますが、数時間かけても見つかりませんでした:(
spring - NodeEntity の一意の制約
Spring Data、Neo4j、Jackson を使用して JSON API を提供しています。次のような単純な User クラスがあります。
URLで属性@Indexed
を使用しています。このフィールドを一意id
に設定する可能性はありますか? (RDBMS のように)
これで、同じ ID を持つ多くのユーザーを作成できます。
2 番目に例外を設定するsave
か、少なくとも DB の最初のユーザーを置き換えたいと考えています。
ありがとうございました。
java - save method of CRUDRepository is very slow?
i want to store some data in my neo4j database. i use spring-data-neo4j for that.
my code is like the follow:
私の newRisks-array には、約 60000 個のオブジェクトと 60000 個のエッジが含まれています。すべてのノードとエッジには 1 つのプロパティがあります。このループの長さは約 15 ~ 20 分ですが、これは正常ですか? Java VisualVM を使用していくつかのボトルネックを検索しましたが、平均 CPU 使用率は 10 ~ 25% (4 コアの場合) であり、ヒープは半分以下でした。
この操作を後押しするオプションはありますか?
編集:追加は、myRepository.save(newRisks.get(i));
最初の出力が来る数分前に、jvm の最初の呼び出しで assleep fpr に落ちることです
2番目の編集:
クラスリスク:
リスクの作成:
mongodb - 春のデータneo4jとmogodbが混同
Spring-data-Neo4J と Spring-data-MongoDb を併用しています。UserRepository で save メソッドを呼び出すと、エラーが発生します。どんな助けでも大歓迎です。
私のドメインクラス
以下はエラーログです:
java.lang.ClassCastException: org.springframework.data.neo4j.support.mapping.Neo4jPersistentEntityImpl は org.springframework.data.mongodb.core.mapping.MongoPersistentEntity org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator にキャストできません。 onApplicationEvent(MongoPersistentEntityIndexCreator.java:79) org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.onApplicationEvent(MongoPersistentEntityIndexCreator.java:47) org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97) org. springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324) org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:263) org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:165) org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:140) org.springframework.data.neo4j.support.Neo4jTemplate. getPersistentEntity(Neo4jTemplate.java:573) org.springframework.data.neo4j.support.Neo4jTemplate.getMappingPolicy(Neo4jTemplate.java:470) org.springframework.data.neo4j.support.Neo4jTemplate.getMappingPolicy(Neo4jTemplate.java:631) org. springframework.data.neo4j.support.Neo4jTemplate.save(Neo4jTemplate.java:295) org.springframework.data.neo4j.repository.AbstractGraphRepository.save(AbstractGraphRepository.java:106) sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) sun .reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.springframework.data.repository.core.support. RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:323) org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:308) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation. java:172) org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) $Proxy82 .save (不明なソース) sun.reflect.NativeMethodAccessorImpl.invoke0 (ネイティブ メソッド) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) .Method.invoke(Method.java:597) org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java: 172) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) $Proxy84.save(不明なソース)202) $Proxy84.save(不明なソース)202) $Proxy84.save(不明なソース)
generics - Hamcrest: iterableWithSize が失敗すると、「got: com.xxx.MyIterClass$1@1970ae0」のような悪いメッセージが表示されます
hamcrest (1.3.RC2、JUnit 依存関係なし) で、SpringDataNeo4j ライブラリで iterableWithSize() を使用すると失敗します。
私はこのようにIterator
パラメータ化された(の拡張)を持っていますContent
どこEndResult
ですか
パッケージ org.springframework.data.neo4j.conversion; public インターフェイス EndResult extends Iterable {...}
そしてContent
aa @NodeEntity
Pojoです。
Mark Petersの助けを借りて、私はこのように呼ぶべきであることを学びました
なぜなら、 iterable 自体の具象型ではなく、iterableWithSize
あなたのコンポーネント型に型付けされているからです。Iterable
しかし、テストが実行されると、
1) 何か間違ったことをしている、または 2) hamcrest または 3) Spring Data Neo4j にバグがあるかどうかを把握しようとして、手元のオブジェクトをチェックしましたが、次のように問題ないようですIterable
:
だから、ハムクレストに問題があると結論付けているのではないでしょうか。IsIterableWithSize で似たようなことを試した人はいますか?
eclipse - spring-data-neo4j が storeDirectory にワークスペース ディレクトリを使用していない
私のさまざまなサンプル プロジェクトはうまく機能していますが、データベースは私の Eclipse アプリケーション自体に格納されています。OSX で Eclipse を使用していますが、既知の問題はありますか? これまでに誰かが同じ問題を抱えていましたか?
私は次のようにパスを指定しました: