我正在Neo4j中使用JSON创建Person标记的节点,类似于此(由于隐私/大量数据,JSON是空白的):
WITH [] AS contacts
UNWIND contacts AS contact
但有时人员数据没有名字和姓氏, 所以这个查询失败了:
MERGE(personBind:Person {first_name: contact.first_name, last_name: contact.last_name})
它给出了这个错误:
Cannot merge node using null property value
是否可以拥有MATCH
,其中包含类似的块:
NOT MATCH
CANT CREATE (Don't do something with person, but make other stuff)
CAN CREATE (Make person and relations to person, and make other stuff)
ON MATCH (Make relations to person, and make other stuff)
这是我需要使用的其他代码, 但是要“附着”给人(有时会失败):
FOREACH (addr IN contact.addrs |
MERGE addrPath=((zipBind:ZipCode {zipcode: addr.zipcode})-[nz:NUMBER_IN_ZIPCODE]->(houseBind:House {number: addr.housenumber})<-[ns:NUMBER_IN_STREET]-(streetBind:Street))
MERGE(personBind)-[:WORKS_AT]->(houseBind)
)
FOREACH( phoneValue IN contact.phone | MERGE(phoneBind:Phone {number: phoneValue.value}) MERGE(personBind)-[:REACHABLE_BY]->(phoneBind) )
FOREACH( emailValue IN contact.email | MERGE(emailBind:Email {email: emailValue.value}) MERGE(personBind)-[:REACHABLE_BY]->(emailBind) )
答案 0 :(得分:1)
将您的查询分为两部分:首先,解决通用部分(联系人数据),然后对具有名字和姓氏的人进行筛选并合并其他组件。
UNWIND [] AS contact
WITH contact
UNWIND contact.addrs AS addr
MERGE (zipBind:ZipCode {zipcode: addr.zipcode})
MERGE (streetBind:Street) # does this need properties, like a name?
MERGE (streetBind) - [:NUMBER_IN_STREET] ->(houseBind:House {number: addr.housenumber})
MERGE (zipBind) -[:NUMBER_IN_ZIPCODE]-> (houseBind)
WITH contact, COLLECT(houseBind) AS houseBinds
UNWIND contact.phone AS phoneValue
MERGE(phoneBind:Phone {number: phoneValue.value})
WITH contact, houseBinds, COLLECT(phoneBind) AS phoneBinds
UNWIND contact.email AS emailValue
MERGE(emailBind:Email {email: emailValue.value})
WITH contact, houseBinds, phoneBinds, COLLECT(emailBind) AS emailBinds
<NOW FILTER FOR CONTACTS WITH PERSON DATA>
WHERE exists(contact.first_name) AND EXISTS(contact.last_name)
MERGE(personBind:Person {first_name: contact.first_name, last_name: contact.last_name})
FOREACH( housebind IN housebinds|MERGE(personBind)-[:WORKS_AT]->(houseBind))
FOREACH( phoneBind IN phoneBinds | MERGE(personBind)-[:REACHABLE_BY]->(phoneBind) )
FOREACH( emailBind IN emailBinds | ) MERGE(personBind)-[:REACHABLE_BY]->(emailBind) )
如果您需要稍后在查询中没有人名的行,则可以更改过滤器步骤以创建两个列表,一个具有名称,一个不具有名称,但是比你的问题要复杂得多。
已编辑:您的Street
个节点没有属性,因此此查询将为每一行找到相同的街道。你想在那里分配一些东西吗?
答案 1 :(得分:0)
使用foreach和case的组合:
UNWIND [ {lastName: 'Fam1', firstName: 'Nam1'}, {lastName: 'Fam2'} ]
as contact
FOREACH( x in CASE WHEN ( NOT contact.lastName is NULL AND
NOT contact.firstName is NULL
) THEN [1] ELSE [] END |
MERGE (personBind:TMP:Person {first_name: contact.firstName,
last_name: contact.lastName}
)
)
http://www.markhneedham.com/blog/2014/06/17/neo4j-load-csv-handling-conditionals/