0

オファーと顧客のグラフがあります。顧客は別の顧客とオファーを共有できるため、これが発生したときにハイパーエッジを作成します。

(CustomerA)-[:SHARED_OFFER]->(newNode)

(newNode)-[:FOR_OFFER]->(オファー)

(newNode)-[:SHARED_WITH]->(顧客) (これは多くの顧客である可能性があります)

別の顧客 B が他の顧客と同じオファーを共有している場合、この関係を表す新しいノードを作成する必要があります。1 つの Cypher クエリでこれらすべてを達成する方法はありますか?

私は使っている:

start c=node:node_auto_index(name="C1"), o=node:node_auto_index(name="Offer"), sharedCustomer=node:node_auto_index(name="C2")
create unique c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o), (sharedOffer)-[:SHARED_WITH]->(sharedCustomer)

これは初めて機能します。次のコンソールを参照してください: http://console.neo4j.org/r/76no2g このクエリは、C1 がオファーを C2 と共有したときに関係を正しく作成しました。

C2 が C3 とオファーを共有する場合のクエリを実行すると、同じノードが再利用されます。これは私が望んでいることではありません。SHARED_OFFER 関係を持つ C2 から作成された新しいノードがあるはずです。クエリは次のとおりです。

start c=node:node_auto_index(name="C2"), o=node:node_auto_index(name="Offer"), sharedCustomer=node:node_auto_index(name="C3")
create unique c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o), (sharedOffer)-[:SHARED_WITH]->(sharedCustomer)

どんな助けでも大歓迎です。注: 私は 1.8.1 REST を使用しているため、これを部分的にではなく一度に達成しようとしています。

4

1 に答える 1

1

単に使用しないcreate uniqueでくださいcreate。ただし、最初に start 句のパスで取得したすべてのノードを指定し、paramsharedOfferを常に未指定のままにして、create コマンドが未指定の要素だけを作成するようにしてください。

create代わりに使用を更新create uniqueし、既存のリレーションをフィルタリングします (または 2 つのクエリを使用します。1 つは C1 で sharedOffer が既に存在するかどうかを確認し、2 番目は C3 で sharedOffer を更新します)。

START c=node:node_auto_index(name="C1"), o=node:node_auto_index(name="Offer"), sharedCustomer=node:node_auto_index(name="C2")
WHERE not(c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o))
CREATE c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o), (sharedOffer)-[:SHARED_WITH]->(sharedCustomer)
于 2013-02-14T09:23:57.000 に答える