我在Neo4j中使用OpenStreetMap数据集,我想重组。
我知道如何使用Street
制作唯一的Zip
和MERGE()
标记节点。
MERGE(street:Street {street_name: n.`addr:street`})
MERGE(zip:ZipCode {zipcode: n.`addr:postcode`})
但我也希望Housenumber
标记节点,数字有时可以相同,
但这些数字从未指向同一条街道。
我认为MERGE()
并不完全适合这种情况。
所以,我希望结构是这样的:
Street<-number_in_street<-Housenumber
ZipCode<-number_in_zipcode<-Housenumber
Coolstreet<-number_in_street<-20A (Unique Housenumber node 1)
Otherstreet<-number_in_street<-20A (Unique Housenumber node 2)
5680 PC<-number_in_zipcode<-20A (Unique Housenumber node 1)
5680 PC<-number_in_zipcode<-20A (Unique Housenumber node 2)
如何通过在Neo4j中使用OpenStreetMap数据集来实现Cypher的这种结构?
修改 我不想复制街道名称,与门牌号码有一定的组合。 我想将street和housenumber作为一个单独的节点(以防止重复)。 一条独特的街道需要指向那条街上的几个住宅号。
所以我有像这样的空白标签节点:
addr:housenumber:199A
addr:street:Coolstreet
source:BAG
addr:postcode:5414 AP
需要拆分为Street,Housenumber和Zipcode, 具有所要求的结构。
答案 0 :(得分:1)
MERGE
将完全按照您的方式防止重复。如果您想在节点上同时获取housenumber和street,以便您可以应用唯一性约束,那么您将滥用唯一性约束;它非常适合优化索引查找,重复数据删除只是一个副作用。
这样的事情应该有效:
WITH n
MERGE (z:ZipCode {zipcode: n.`addr:postcode`})
MERGE (s:Street {street_name: n.`addr:street`})
MERGE (s) - [:NUMBER_IN_STREET] -> (n:HouseNumber {house_number: n.`addr:housenumber`})
MERGE (z) - [:NUMBER_IN_ZIPCODE] -> (n)
作为整个模式的一部分,{p> MERGE
HouseNumber
确保它对于该街道名称是唯一的。您甚至可以在house_number
属性上放置一个常规索引(非唯一)来加快速度。