1. HOME
  2. ブログ
  3. 2 . テクノロジー
  4. Neo4jのCypherで末端親ノードの情報を取得する方法
BLOG

ブログ

2 . テクノロジー

Neo4jのCypherで末端親ノードの情報を取得する方法

Neo4jのノードグラフ - 中央ノードから放射状に広がる2001年シリーズのパテントノードとそれらを接続するORIGINAL、REGIONAL、PRIORITYリレーションシップを示す図

Neo4jの話です。
つぎのようなpathの場合、

MATCH path=(c:C_Patent)-[r:ORIGINAL|REGIONAL|PRIORITY*0..]->(p)
WHERE
	c.Name = "2001-0004-XXXX" // 子ノードの条件
	AND (p:C_Patent OR p:C_Design OR p:C_Trademark OR p:C_Gazette) // 親ノードのラベル条件
	AND NOT (p)-[:ORIGINAL|REGIONAL|PRIORITY]->() // 末端であることの条件
RETURN path;

‘path’の部分を以下のように変更すれば、末端親ノードのNameの配列が取得できます。

MATCH(c:C_Patent)-[r:ORIGINAL|REGIONAL|PRIORITY*0..]->(p)
WHERE
	c.Name = "2001-0004-XXXX" // 子ノードの条件
	AND (p:C_Patent OR p:C_Design OR p:C_Trademark OR p:C_Gazette) // 親ノードのラベル条件
	AND NOT (p)-[:ORIGINAL|REGIONAL|PRIORITY]->() // 末端であることの条件
RETURN COLLECT(DISTINCT p.Name);

◆リレーションの数やモジュールも取得したいのなら、

MATCH(c:C_Patent)-[r:ORIGINAL|REGIONAL|PRIORITY*0..]->(p)
WHERE
	c.Name = "2001-0004-XXXX" // 子ノードの条件
	AND (p:C_Patent OR p:C_Design OR p:C_Trademark OR p:C_Gazette) // 親ノードのラベル条件
	AND NOT (p)-[:ORIGINAL|REGIONAL|PRIORITY]->() // 末端であることの条件
RETURN COLLECT(DISTINCT {Name:p.Name, Size:SIZE(r), module:LABELS(p)[0]})

◆リレーション数でソートする場合は、

MATCH(c:C_Patent)-[r:ORIGINAL|REGIONAL|PRIORITY*0..]->(p)
WHERE
	c.Name = "2001-0004-XXXX" // 子ノードの条件
	AND (p:C_Patent OR p:C_Design OR p:C_Trademark OR p:C_Gazette) // 親ノードのラベル条件
	AND NOT (p)-[:ORIGINAL|REGIONAL|PRIORITY]->() // 末端であることの条件
WITH DISTINCT {Name:p.Name, Size:SIZE(r), module:LABELS(p)[0]} AS map ORDER BY map.Size
RETURN COLLECT(DISTINCT map)

関連記事