如何使用Kafka和Neo4j流配置Neo4j接收器实例
我正在使用neo4j streams插件和Kafka设置两个neo4j实例(源和接收器) 我已经知道了如何设置这样的集群,但我无法让接收器实例工作 我正在使用下面的docker compose如何使用Kafka和Neo4j流配置Neo4j接收器实例,neo4j,apache-kafka,docker-compose,Neo4j,Apache Kafka,Docker Compose,我正在使用neo4j streams插件和Kafka设置两个neo4j实例(源和接收器) 我已经知道了如何设置这样的集群,但我无法让接收器实例工作 我正在使用下面的docker compose version: '3' services: neo4j-source: image: neo4j:3.4 hostname: neo4j-source container_name: neo4j-source ports: - "7474:7474"
version: '3'
services:
neo4j-source:
image: neo4j:3.4
hostname: neo4j-source
container_name: neo4j-source
ports:
- "7474:7474"
- "7687:7687"
depends_on:
- kafka
volumes:
- ./plugins:/plugins
environment:
NEO4J_AUTH: neo4j/source
NEO4J_dbms_logs_debug_level: DEBUG
NEO4J_kafka_zookeeper_connect: zookeeper:12181
NEO4J_kafka_bootstrap_servers: kafka:19092
neo4j-sink:
image: neo4j:3.4
hostname: neo4j-sink
container_name: neo4j-sink
ports:
- "7475:7474"
- "7688:7687"
depends_on:
- kafka
volumes:
- ./plugins:/plugins
environment:
NEO4J_AUTH: neo4j/sink
NEO4J_dbms_logs_debug_level: DEBUG
NEO4J_kafka_zookeeper_connect: zookeeper:12181
NEO4J_kafka_bootstrap_servers: kafka:19092
NEO4J_streams_sink_topic_cypher_neo4j: "WITH event.value.payload AS payload, event.value.meta AS meta
FOREACH (ignoreMe IN CASE WHEN payload.type = 'node' AND meta.operation <> 'deleted' and payload.after.labels[0] = 'Question' THEN [1] ELSE [] END |
MERGE (n:Question{neo_id: toInteger(payload.id)}) ON CREATE
SET n += payload.after.properties
)
FOREACH (ignoreMe IN CASE WHEN payload.type = 'node' AND meta.operation <> 'deleted' and payload.after.labels[0] = 'Answer' THEN [1] ELSE [] END |
MERGE (n:Answer{neo_id: toInteger(payload.id)}) ON CREATE
SET n += payload.after.properties
)
FOREACH (ignoreMe IN CASE WHEN payload.type = 'node' AND meta.operation <> 'deleted' and payload.after.labels[0] = 'User' THEN [1] ELSE [] END |
MERGE (n:User{neo_id: toInteger(payload.id)}) ON CREATE
SET n += payload.after.properties
)
FOREACH (ignoreMe IN CASE WHEN payload.type = 'node' AND meta.operation <> 'deleted' and payload.after.labels[0] = 'Tag' THEN [1] ELSE [] END |
MERGE (n:Tag{neo_id: toInteger(payload.id)}) ON CREATE
SET n += payload.after.properties
)
FOREACH (ignoreMe IN CASE WHEN payload.type = 'relationship' AND meta.operation <> 'deleted' and payload.label = 'ANSWERS' THEN [1] ELSE [] END |
MERGE (s:Answer{neo_id: toInteger(payload.start.id)})
MERGE (e:Question{neo_id: toInteger(payload.end.id)})
CREATE (s)-[:ANSWERS{neo_id: toInteger(payload.id)}]->(e)
)
FOREACH (ignoreMe IN CASE WHEN payload.type = 'relationship' AND meta.operation <> 'deleted' and payload.label = 'TAGGED' THEN [1] ELSE [] END |
MERGE (s:Question{neo_id: toInteger(payload.start.id)})
MERGE (e:Tag{neo_id: toInteger(payload.end.id)})
CREATE (s)-[:TAGGED{neo_id: toInteger(payload.id)}]->(e)
)
FOREACH (ignoreMe IN CASE WHEN payload.type = 'relationship' AND meta.operation <> 'deleted' and payload.label = 'PROVIDED' THEN [1] ELSE [] END |
MERGE (s:User{neo_id: toInteger(payload.start.id)})
MERGE (e:Answer{neo_id: toInteger(payload.end.id)})
CREATE (s)-[:PROVIDED{neo_id: toInteger(payload.id)}]->(e)
)
FOREACH (ignoreMe IN CASE WHEN payload.type = 'relationship' AND meta.operation <> 'deleted' and payload.label = 'ASKED' THEN [1] ELSE [] END |
MERGE (s:User{neo_id: toInteger(payload.start.id)})
MERGE (e:Question{neo_id: toInteger(payload.end.id)})
CREATE (s)-[:ASKED{neo_id: toInteger(payload.id)}]->(e)
)"
zookeeper:
image: confluentinc/cp-zookeeper:latest
hostname: zookeeper
container_name: zookeeper
ports:
- "12181:12181"
environment:
ZOOKEEPER_CLIENT_PORT: 12181
kafka:
image: confluentinc/cp-kafka:latest
hostname: kafka
container_name: kafka
ports:
- "19092:19092"
depends_on:
- zookeeper
environment:
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:12181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:19092
我在卡夫卡身上看到了这样的信息:
{"payload":{"id":"0","before":null,"after":{"properties":{"name":"John Smith"},"labels":["User"]},"type":"node"},"meta":{"timestamp":1554075819827,"username":"neo4j","txId":4,"txEventId":0,"txEventsCount":1,"operation":"created","source":{"hostname":"neo4j-source"}},"schema":{"properties":[],"constraints":null}}
和docker实例中的日志:
neo4j-source | 2019-03-31 23:43:39.876+0000 DEBUG Trying to send a transaction event with txId 4 and txEventId 0 to kafka
neo4j-source | 2019-03-31 23:43:40.167+0000 DEBUG Sent record in partition 0 offset 0 data neo4j key size 3
neo4j-sink | 2019-03-31 23:43:40.228+0000 DEBUG Reading data from topic neo4j, with data [{payload={id=0, before=null, after={properties={name=John Smith}, labels=[User]}, type=node}, meta={timestamp=1554075819827, username=neo4j, txId=4, txEventId=0, txEventsCount=1, operation=created, source={hostname=neo4j-source}}, schema={properties=[], constraints=null}}]
neo4j-sink | 2019-03-31 23:43:40.236+0000 DEBUG Processing 1 events, for topic neo4j with query: UNWIND {events} AS event WITH event.value.payload AS payload, event.value.meta AS meta FOREACH (ignoreMe IN CASE WHEN payload.type = 'node' AND meta.operation <> 'deleted' and payload.after.labels[0] = 'Question' THEN [1] ELSE [] END | MERGE (n:Question{neo_id: toInteger(payload.id)}) ON CREATE SET n += payload.after.properties ) FOREACH (ignoreMe IN CASE WHEN payload.type = 'node' AND meta.operation <> 'deleted' and payload.after.labels[0] = 'Answer' THEN [1] ELSE [] END | MERGE (n:Answer{neo_id: toInteger(payload.id)}) ON CREATE SET n += payload.after.properties ) FOREACH (ignoreMe IN CASE WHEN payload.type = 'node' AND meta.operation <> 'deleted' and payload.after.labels[0] = 'User' THEN [1] ELSE [] END | MERGE (n:User{neo_id: toInteger(payload.id)}) ON CREATE SET n += payload.after.properties ) FOREACH (ignoreMe IN CASE WHEN payload.type = 'node' AND meta.operation <> 'deleted' and payload.after.labels[0] = 'Tag' THEN [1] ELSE [] END | MERGE (n:Tag{neo_id: toInteger(payload.id)}) ON CREATE SET n += payload.after.properties ) FOREACH (ignoreMe IN CASE WHEN payload.type = 'relationship' AND meta.operation <> 'deleted' and payload.label = 'ANSWERS' THEN [1] ELSE [] END | MERGE (s:Answer{neo_id: toInteger(payload.start.id)}) MERGE (e:Question{neo_id: toInteger(payload.end.id)}) CREATE (s)-[:ANSWERS{neo_id: toInteger(payload.id)}]->(e) ) FOREACH (ignoreMe IN CASE WHEN payload.type = 'relationship' AND meta.operation <> 'deleted' and payload.label = 'TAGGED' THEN [1] ELSE [] END | MERGE (s:Question{neo_id: toInteger(payload.start.id)}) MERGE (e:Tag{neo_id: toInteger(payload.end.id)}) CREATE (s)-[:TAGGED{neo_id: toInteger(payload.id)}]->(e) ) FOREACH (ignoreMe IN CASE WHEN payload.type = 'relationship' AND meta.operation <> 'deleted' and payload.label = 'PROVIDED' THEN [1] ELSE [] END | MERGE (s:User{neo_id: toInteger(payload.start.id)}) MERGE (e:Answer{neo_id: toInteger(payload.end.id)}) CREATE (s)-[:PROVIDED{neo_id: toInteger(payload.id)}]->(e) ) FOREACH (ignoreMe IN CASE WHEN payload.type = 'relationship' AND meta.operation <> 'deleted' and payload.label = 'ASKED' THEN [1] ELSE [] END | MERGE (s:User{neo_id: toInteger(payload.start.id)}) MERGE (e:Question{neo_id: toInteger(payload.end.id)}) CREATE (s)-[:ASKED{neo_id: toInteger(payload.id)}]->(e) )
neo4j-sink | 2019-03-31 23:43:41.975+0000 DEBUG Query statistics:
neo4j-sink | <Nothing happened>
neo4j source | 2019-03-31 23:43:39.876+0000调试试图向kafka发送带有txId 4和txEventId 0的事务事件
neo4j源| 2019-03-31 23:43:40.167+0000调试已发送记录在分区0偏移量0数据neo4j密钥大小3
neo4j接收器| 2019-03-31 23:43:40.228+0000调试从主题neo4j读取数据,数据[{payload={id=0,before=null,before=after={properties={name=John Smith},labels=[User]},type=node},meta={timestamp=1554075819827,username=neo4j,txId=4,txEventId=0,txeventcount=1,operation=created,source={hostname=neo4j-source,constraints=null}]
neo4j sink | 2019-03-31 23:43:40.236+0000调试处理1个事件,主题neo4j带有查询:将{events}作为事件展开,将event.value.payload作为有效负载,将event.value.meta作为meta FOREACH(如果payload.type='node'和meta.operation'deleted'和payload.after.labels[0]='Question',[1]否则[]结束|合并创建集n+=payload.after.properties上的问题{neo_id:toInteger(payload.id)})FOREACH(如果payload.type='node'和meta.operation'deleted'和payload.after.labels[0]='Answer',然后[1]ELSE[]结束|合并(n:在创建集n+=payload.after.properties上的答案{neo_id:toInteger(payload.id)})FOREACH)(如果payload.type='node'和meta.operation'deleted'和payload.after.labels[0]='User'然后[1]ELSE[]结束|在创建集n+=payload.after.properties上合并(n:User{neo_id:toInteger(payload.id)})FOREACH(如果payload.type='node'和meta.operation'deleted'和payload.after.labels[0]='Tag'然后[1]ELSE[]END | MERGE(n:Tag{neo_id:toInteger(payload.id)})在CREATE SET n+=payload.after.properties)FOREACH(如果payload.type='relationship'和meta.operation'deleted'和payload.label='ANSWERS[]END | MERGE(s:Answer{neo_id:toInteger(payload.start.id)})合并(e:Question{neo_id:toInteger(payload.end.id)})创建(s)-[:答案{neo_id:toInteger(payload.id)}]->(e)FOREACH(在payload.type='relationship'和meta.operation'deleted'和payload.label='taged'的情况下ignoreMe,然后[1]否则[]结束}合并(s:Question{neo_id:toInteger(payload.start.id)})合并(e:Tag{neo_id:toInteger(payload.end.id)})CREATE(s)-[:taged{neo_id:toInteger(payload.id)}]->(e))FOREACH(如果payload.type='relationship'和meta.operation'deleted'和payload.label='PROVIDED',则[1]否则[]结束{MERGE(s:User{neo_id:toInteger(payload.start.id)})合并(e:response{neo_id:toInteger(payload.END.id)})创建-[:提供{neo_id:toInteger(payload.id)}]->(e)FOREACH(ignoreMe在payload.type='relationship'和meta.operation'deleted'和payload.label='ASKED'的情况下,然后[1]ELSE[]END | MERGE(s:User{neo_id:toInteger(payload.start.id)})MERGE(e:Question{neo_id:toInteger(payload.END.id)})创建(s)-[:ask{neo_id:toInteger(neo_-id:toInteger(payload.id)}]->(e))
neo4j接收器| 2019-03-31 23:43:41.975+0000调试查询统计信息:
neo4j水槽|
而且,正如您在日志中看到的,在接收器中没有创建任何内容
我尝试过简单的查询,但无法在sink neo4j中传递任何节点。应该如何更改sinkstreams.sink.topic.cypher
query?
谢谢!消费者配置中似乎包含错误,来自kafka主题的事件在JSON中没有值
而不是
...
NEO4J_streams_sink_topic_cypher_neo4j: "WITH event.value.payload AS payload, event.value.meta AS meta
FOREACH (ignoreMe IN CASE WHEN payload.type = 'node' AND meta.operation <> 'deleted' and payload.after.labels[0] = 'Question' THEN [1] ELSE [] END |
...
...
NEO4J_streams_sink_topic_cypher_neo4j: "WITH event.value.payload AS payload, event.value.meta AS meta
FOREACH (ignoreMe IN CASE WHEN payload.type = 'node' AND meta.operation <> 'deleted' and payload.after.labels[0] = 'Question' THEN [1] ELSE [] END |
...
...
NEO4J_streams_sink_topic_cypher_neo4j: "WITH event.payload AS payload, event.meta AS meta
FOREACH (ignoreMe IN CASE WHEN payload.type = 'node' AND meta.operation <> 'deleted' and payload.after.labels[0] = 'Question' THEN [1] ELSE [] END |
...
neo4j-sink | 2019-04-01 21:21:09.263+0000 DEBUG Query statistics:
neo4j-sink | Nodes created: 1
neo4j-sink | Properties set: 2
neo4j-sink | Labels added: 1