如前所述,
http://neo4j.com/docs/stable/transactions-events.html
事务事件侦听器以不可预测的顺序执行。
我想在实体上指定一个UUID,然后将它推到Elastic中,并将该字段编入索引,而不是默认的neo4j @GraphId,后者被专门描述为不好的实践,我理解为什么neo4j UUID插件会被创建。
这些是我试图用来实现这一目标的neo4j的2个文档化插件。
https://github.com/neo4j-contrib/neo4j-elasticsearch https://github.com/graphaware/neo4j-uuid
一个示例neo4j.properties配置将是:
#elasticsearch plugin
elasticsearch.host_name=http://localhost:9200
elasticsearch.index_spec=persons:Person(uuid,name)
#uuid plugin
com.graphaware.module.UIDM.uuidProperty=uuid 通过尝试创建Person节点,我将得到以下跟踪的异常
Caused by: org.neo4j.kernel.api.exceptions.TransactionHookException: Transaction handler failed.
at org.neo4j.kernel.impl.api.TransactionHooks$TransactionHooksState.add(TransactionHooks.java:100)
at org.neo4j.kernel.impl.api.TransactionHooks.beforeCommit(TransactionHooks.java:59)
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.commit(KernelTransactionImplementation.java:512)
... 37 more
Caused by: org.neo4j.graphdb.NotFoundException: NODE[2] has no property with propertyKey="uuid".
at org.neo4j.kernel.impl.core.NodeProxy.getProperty(NodeProxy.java:482)
at org.neo4j.elasticsearch.ElasticSearchEventHandler.nodeToJson(ElasticSearchEventHandler.java:188)
at org.neo4j.elasticsearch.ElasticSearchEventHandler.indexRequests(ElasticSearchEventHandler.java:119)
at org.neo4j.elasticsearch.ElasticSearchEventHandler.beforeCommit(ElasticSearchEventHandler.java:47)
at org.neo4j.elasticsearch.ElasticSearchEventHandler.beforeCommit(ElasticSearchEventHandler.java:27)
at org.neo4j.kernel.TransactionEventHandlers.beforeCommit(TransactionEventHandlers.java:130)
at org.neo4j.kernel.TransactionEventHandlers.beforeCommit(TransactionEventHandlers.java:49)
... 39 more
Caused by: org.neo4j.kernel.api.exceptions.PropertyNotFoundException: NODE[2] has no property with propertyKeyId=31.
at org.neo4j.kernel.impl.core.NodeProxy.getProperty(NodeProxy.java:475)
... 45 more如果两个插件不能一起工作,如何实现这一点?
发布于 2016-04-16 18:22:38
在使用UUID模块时,可以使用GraphAware Neo4j弹性搜索集成模块,该模块将负责开箱即用。
在最小配置之后,您将能够指定哪些节点标签,甚至哪些属性必须进行索引。
发布于 2016-04-16 19:25:10
如果您已经注册了多个TransactionsEventHandler,请注意它们的执行顺序没有定义。内部Neo4j使用CopyOnWriteArraySet,请参阅https://github.com/neo4j/neo4j/blob/3.1/community/kernel/src/main/java/org/neo4j/kernel/internal/TransactionEventHandlers.java#L50
为了解决这个问题,我建议创建一个具有委托列表( uuid处理程序和弹性tx处理程序)的DelegatingTransactionEventHandler,并按顺序执行它们。
https://stackoverflow.com/questions/36663963
复制相似问题