1

ノード A がノード B から始まる Cypher クエリの一部であるノード A に接続されているノードの数を数えようとしていますが、予期しない結果が得られます。設定例を次に示します。本と所有者を見ているとしましょう。本は他の本を引用していますが、もちろん所有者は本を所有しています。

Book B1
Book B2 CITES B1
Book B3 CITES B1
Book B4
Owner O1 OWNS B1
Owner O2 OWNS B2
Owner O3 OWNS B3 and B4

では、Book B1 を見ていて、それを引用している各本を見つけて、引用している本を所有している各人が所有している本を数えたいとします。したがって、B1 から始めると、所有者 O2 と O3 を見つける必要があります。それぞれが B1 を引用する本を所有しているためです。彼らが持っている本を数えるなら、O2 なら 1 冊、O3 なら 2 冊だ。

まず、所有者を一覧表示するだけのクエリは問題なく機能します。

start a=node(1) MATCH a<-[:CITES]-b<-[:OWNS]-c return c.name

これにより、期待どおりの名前が返されます。しかし、このクエリ:

start a=node(1) MATCH a<-[:CITES]-b<-[:OWNS]-c-[:OWNS]->d return c.name, count(d)

所有者のリストである c にたどり着き、所有している本を d として OWNS の関係をたどってカウントする必要があるようです。しかし、代わりに私は得る:

+--------------------+
| c.name  | count(d) |
+--------------------+
| "O3"    | 1        |
+--------------------+

他の OWNS リンク (b で表されるもの) を通じて既に見つかったブック/ノードを除外しているように感じます。単一のクエリでこれを行う方法はありますか、または所有者を c として収集し、それぞれに対して再度クエリを実行するのが最善ですか? これは可能であるように感じますが、私はまだそれを理解していません。どんなアイデアでも素晴らしいでしょう-事前に感謝します。

4

1 に答える 1

0

そうです、ノードが見つかると、別の名前の変数の下で同じ一致でそれを再び見つけることはできません。を使用してこれを分割し、同じ方法でWITH使用するとd、それらすべてに一致します。

START a=node(14) 
MATCH a<-[:CITES]-b<-[:OWNS]-c 
WITH c MATCH c-[:OWNS]->d 
RETURN c.name, count(d);

http://console.neo4j.org/?id=x1jst9

于 2012-10-04T05:41:49.920 に答える