如何结合Neo4j UUID和Neo4j Elastic Search插件

时间:2016-04-16 12:04:46

标签: elasticsearch neo4j

如上所述,

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

如果两个插件无法一起工作,怎么能实现呢?

2 个答案:

答案 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处理程序)并按顺序执行它们。