唯一节点指向其他节点,但在Neo4j中具有相同的值

时间:2016-09-10 10:59:43

标签: neo4j cypher

我在Neo4j中使用OpenStreetMap数据集,我想重组。 我知道如何使用Street制作唯一的ZipMERGE()标记节点。

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, 具有所要求的结构。

1 个答案:

答案 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属性上放置一个常规索引(非唯一)来加快速度。