2016-09-10 8 views
0

私はNeo4jでOpenStreetMapデータセットを使用しています。 MERGE()を使用して、どのように唯一のStreetZipラベル付きノードを作成できるか分かります。他のノードを指しているが、同じ値のNeo4jのノード

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のデータセットを使用することにより、このような構造を実現することができますか?

編集: 私は、家の番号と特定の組み合わせを持っている、通りの名前を複製にしたくありません。 私は通りとhousenumberを別のノード(重複を防ぐために)として欲しいです。 1つのユニークなストリートは、その通りにある複数の住宅街を指し示す必要があります。

だから私はこのような空白labbeledのノードがあります:ストリート、Housenumberや郵便番号に分割される必要がある

addr:housenumber:199A 
addr:street:Coolstreet 
source:BAG 
addr:postcode:5414 AP 

を、 は、要求された構造を有するwhill。

+1

*すべての*アドレスに新しいHousenumberノードを追加しますか?または、ストリートと郵便番号の両方に固有の番号のセット?なぜ?あなたのケースをもう少し詳しく説明するのに役立ちます。 –

+0

@MartinPreusse重複を避けるために、空のノードの例については私の編集を参照してください。空のノードの例は、要求された構造を持つように "分割"する必要があります。 –

+0

私はそれを取得しません。あなたが話しているhousenumberノードの「一意性」を定義するものは何ですか?なぜあなたのような 'MERGE'住宅ノードだけが他のものと' MERGE'の関係を作って関係を作っていないのですか? –

答えて

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) 

MERGEパターン全体の一部としてHouseNumberをINGのは、それはその通りの名前のために一意であることを保証します。 house_numberプロパティに通常のインデックス(非ユニーク)を設定することもできます。

関連する問題