如上所述,
http://neo4j.com/docs/stable/transactions-events.html
事务事件侦听器以不可预测的顺序执行。
我希望在将实体推送到Elastic Search之前为其分配一个UUID,并将该字段编入索引,而不是neo4j的默认@GraphId,这被特别描述为不良做法,我理解为什么制作了neo4j UUID插件。
这是neo4j的两个记录插件,我试图用它来实现这一点。
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
如果两个插件无法一起工作,怎么能实现呢?
答案 0 :(得分:3)
当您使用UUID模块时,您可以使用GraphAware Neo4j Elasticsearch Integration模块,该模块将使用开箱即用的uuid。
在minimal configuration之后,您将能够指定哪些节点标签甚至哪些属性必须编入索引。
答案 1 :(得分:2)
如果您注册了多个CopyOnWriteArraySet
,请注意他们的执行顺序未定义。内部Neo4j使用z-index
,请参阅https://github.com/neo4j/neo4j/blob/3.1/community/kernel/src/main/java/org/neo4j/kernel/internal/TransactionEventHandlers.java#L50
为了解决这个问题,我建议创建一个DelegatingTransactionEventHandler,它有一个委托列表(uuid tx处理程序和弹性tx处理程序)并按顺序执行它们。