2017-12-16 17 views
1

私はNeo4jデータベースを操作するNode.jsサーバーを作っています。今私は管理者と投稿のシステムを持っており、管理者は投稿を追加しています。今、私は私が管理ノード「COLLEAGUE_OF」との間の関係を追加するようにネットワークを相互接続することにしたいCypherクエリが機能しないのはなぜですか?

data model

:これは私のグラフがどのように見えるか、現在あります。私はCypherクエリを書いたが、Cypher構文エラーが出ている。

これは構文です:

MERGE (c:Admin) 
MERGE (n:BlogPost {mongoId:{idNeo}}) 
MERGE (b:Admin {mongoAdminId:{idNeoAd}}) 
MERGE(n)-[:ADDED_BY]->(b), (b)-[:COLLUEGE_OF]->(c) 

これは構文を実行し、全体のルートである:

routes.post('/blogPosts/frontpage/:id/:aid', function (req, res) { 
    const id = req.param('id'); 
    const aid = req.param('aid'); 

    session 
    .run("MERGE (c:Admin) MERGE (n:BlogPost {mongoId:{idNeo}}) MERGE (b:Admin {mongoAdminId:{idNeoAd}}) MERGE(n)-[:ADDED_BY]->(b), (b)-[:COLLUEGE_OF]->(c)", {idNeo: id, idNeoAd: aid}) 
    .then(function(result) { 
     res.status(200).json({"response": "BlogPost added to front page."}); 
     session.close(); 
    }) 
    .catch((error) => { 
     res.status(400).json(error); 
    }); 
}); 
+0

あなたの最初のMERGEは、すべてにマッチします:グラフの管理ノード、およびsu管理ノードを 'b':Adminノードに接続します(' b'がすでに存在する場合は 'b'もそれ自体に接続します)。それは本当にあなたが望むものですか?また、あなたは関係が欲しいと思っています:COLLEAGUE_OF? – InverseFalcon

+0

@InverseFalcon私が望むのは、新しい管理者がすべて他の既存の管理者であるCOLLUEGE_OFに追加されたためです。これを行うにはどうすればこのクエリを変更できますか? – Mike

+0

それは役に立つと思うのですか?相互に同僚ではない管理ノードがありますか?他の種類のノードに接続する、グラフ内のCOLLEAGUE_OF関係(またはグラフ用に計画されている)はありますか?その関係がどこにトラバースされるべきかを書くためにどのような種類のクエリーを計画していますか。 – InverseFalcon

答えて

1

と仮定すると:COLLUEGE_OFは(これは英語である場合、あなたがしたいことがあります。代わりにCOLLEAGUE_OFを)したい綴りで、このクエリでは、既存のグラフ取る必要があります:管理ノードをし、お互いにそれらを接続します

MATCH (c:Admin) 
WITH collect(c) as admins 
UNWIND admins as admin1 
UNWIND admins as admin2 
WITH admin1, admin2 
WHERE id(admin1) < id(admin2) // prevents matching to the same pair with swapped order, and matching a node to itself 
MERGE (admin1)-[:COLLUEGE_OF]-(admin2) 

し、グラフに新しいブログ投稿や管理者を追加するとき、このクエリは、(それが以前に処理されていた場合、それはマージを実行しません)を使用することになります。

MERGE (n:BlogPost {mongoId:{idNeo}}) 
MERGE (b:Admin {mongoAdminId:{idNeoAd}}) 
MERGE (n)-[:ADDED_BY]->(b) 
WITH b 
WHERE NOT (b)-[:COLLUEGE_OF]-() 
MATCH (c:Admin) 
WHERE c <> b 
MERGE (b)-[:COLLUEGE_OF]-(c) 

SAことあなたが本当に必要な場合は、idは、:すべてのColleagueGroupノード:管理者が相互に接続されるように、いくつかの種類で、異なっこれをモデル化するためにはるかに容易になるだろう管理者は、次のように接続します

// create the single :ColleagueGroup node for all admins: 
MERGE (group:ColleagueGroup) 
WITH group 
MATCH (c:Admin) 
MERGE (c)-[:COLLUEGE_OF]->(group) 

そして、その後、新しい管理者

// add a new :Admin to the group 
MERGE (n:BlogPost {mongoId:{idNeo}}) 
MERGE (b:Admin {mongoAdminId:{idNeoAd}}) 
WITH n, b 
MATCH (group:ColleagueGroup) 
MERGE (n)-[:ADDED_BY]->(b) 
MERGE (b)-[:COLLUEGE_OF]->(group) 

を追加すると、単一の同僚見つけるための:(すべてとなります:管理者):管理ノードを 'C'上

MATCH (b:Admin {mongoAdminId:{idNeoAd}})-[:COLLUEGE_OF*2]-(colleague:Admin) 
RETURN colleague 
+0

ありがとう、それはまさに私が必要としていたものです。 – Mike

0

問題が, (b)-[:COLLUEGE_OF]->(c)声明、具体的には、クエリの最後の行です、構文エラーが発生します。コンマを削除し、追加のマージステートメントを追加するだけです。

MERGE (c:Admin) 
MERGE (n:BlogPost {mongoId:{idNeo}}) 
MERGE (b:Admin {mongoAdminId:{idNeoAd}}) 
MERGE(n)-[:ADDED_BY]->(b) 
MERGE(b)-[:COLLUEGE_OF]->(c) 
+0

ありがとう、これはうまくいった。今、自分自身との関係を除外する方法はありますか?今はAdmin xがAdmin xの同僚だと言います。 – Mike

関連する問題