我如何在Apache Isis中使用neo4j?

时间:2014-12-20 11:14:55

标签: neo4j datanucleus isis

我正在尝试使用neo4j作为Apache Isis的后备存储,但看起来可能需要一些开发。 如果我添加了datanucleus-neo4j依赖关系,那么看起来neo4j JDO连接正在初始化,但Apache Isis期待一种不同类型的StoreManager。

这是我得到的例外

org.datanucleus.store.neo4j.Neo4jStoreManager无法强制转换为org.datanucleus.store.schema.SchemaAwareStoreManager

如何在Apache Isis中使用neo4j作为后备存储? 我在Isis中读到了关于nosql的支持,但它不是当前版本的一部分吗? http://isis.apache.org/components/objectstores/nosql/about.html

谢谢!

在persistor.properties中 -

#
# neo4j
#
isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=neo4j:testDB
isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=

堆栈跟踪的相关部分 -

Caused by: java.lang.ClassCastException: org.datanucleus.store.neo4j.Neo4jStoreManager cannot be cast to org.datanucleus.store.schema.SchemaAwareStoreManager
at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusApplicationComponents.createSchema(DataNucleusApplicationComponents.java:125)
at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusApplicationComponents.init(DataNucleusApplicationComponents.java:111)
at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusApplicationComponents.<init>(DataNucleusApplicationComponents.java:97)
at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPersistenceMechanismInstaller.createDataNucleusApplicationComponentsIfRequired(DataNucleusPersistenceMechanismInstaller.java:112)
at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPersistenceMechanismInstaller.createObjectStore(DataNucleusPersistenceMechanismInstaller.java:89)
at org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory.createPersistenceSession(PersistenceSessionFactory.java:94)
at org.apache.isis.core.runtime.system.session.IsisSessionFactoryDefault.openSession(IsisSessionFactoryDefault.java:217)
at org.apache.isis.core.runtime.system.context.IsisContextThreadLocal.openSessionInstance(IsisContextThreadLocal.java:149)
at org.apache.isis.core.runtime.system.context.IsisContext.openSession(IsisContext.java:271)
at org.apache.isis.core.runtime.system.IsisSystemFixturesHookAbstract.initializeServices(IsisSystemFixturesHookAbstract.java:154)
at org.apache.isis.core.runtime.system.IsisSystemFixturesHookAbstract.init(IsisSystemFixturesHookAbstract.java:122)
at org.apache.isis.core.runtime.runner.IsisInjectModule.provideIsisSystem(IsisInjectModule.java:133)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.google.inject.internal.ProviderMethod.get(ProviderMethod.java:104)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.Scopes$1$1.get(Scopes.java:65)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:53)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:110)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:75)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:73)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024)
at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:73)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:60)
... 48 more

2 个答案:

答案 0 :(得分:3)

我不确定其含义是什么,但我能够通过修改“Isis Core Runtime模块”中的org.apache.isis.objectstore.jdo.datanucleus.DataNucleusApplicationComponents#createSchema来获取与Apache Isis一起使用的neo4j数据存储区,以检查datanucleus StoreManager是否支持SchemaAwareStoreManager铸造前的界面。

成功保存数据 似乎太容易成为一个合法的增强,但我会由贡献者运行它永远不会。

private void createSchema(final Map<String, String> props, final Set<String> classesToBePersisted) {
    final JDOPersistenceManagerFactory jdopmf = (JDOPersistenceManagerFactory)persistenceManagerFactory;
    final NucleusContext nucleusContext = jdopmf.getNucleusContext();
    final StoreManager storeManager = nucleusContext.getStoreManager();
    if (storeManager instanceof SchemaAwareStoreManager) {
        ((SchemaAwareStoreManager)storeManager).createSchema(classesToBePersisted, asProperties(props));
    }
}

答案 1 :(得分:1)

请参阅Apache Isis邮件列表original querysubsequent ticket