如何限制密码中的子查询?
How to limit a subquery in cypher?
假设我的图形数据库中有 3 个东西,这 3 个东西中的每一个都附加了 0 个或多个子东西。我如何进行查询以检索图中每个事物的前 2 个子事物(根据一些任意顺序)。
这是一个示例设置:
CREATE (t1:Thing)-[:X]->(a1:SubThing),
(t1)-[:X]->(a2:SubThing),
(t1)-[:X]->(a3:SubThing),
(t1)-[:X]->(a4:SubThing),
(t2:Thing)-[:X]->(b1:SubThing),
(t2)-[:X]->(b2:SubThing),
(t2)-[:X]->(b3:SubThing),
(t3:Thing);
我 运行 可以收到什么匹配命令 table 这样的:
t s
(0:Thing) (3:SubThing)
(0:Thing) (4:SubThing)
(1:Thing) (7:SubThing)
(1:Thing) (8:SubThing)
(2:Thing) null
这是一个控制台。neo4j.org我用来解决这个问题的。
你需要在这里使用一个OPTIONAL MATCH
,通过相同的起始节点聚合并根据子事物的数量对结果进行排序:
MATCH (t:Thing)
OPTIONAL MATCH (t)-[:X]->(s)
RETURN t, count(s) AS degree
ORDER BY degree DESC
LIMIT 2
这可能是最好的方法。我不能展开 collection 否则我会丢失空 :Thing
.
MATCH (t:Thing)
OPTIONAL MATCH (t)-->(s:SubThing)
WITH t, s
ORDER BY id(s)
RETURN t, collect(s)[0..2]
ORDER BY id(t)
它returns这个:
t collect(s)[0..2]
(0:Thing) [(3:SubThing), (4:SubThing)]
(1:Thing) [(7:SubThing), (8:SubThing)]
(2:Thing) []
假设我的图形数据库中有 3 个东西,这 3 个东西中的每一个都附加了 0 个或多个子东西。我如何进行查询以检索图中每个事物的前 2 个子事物(根据一些任意顺序)。
这是一个示例设置:
CREATE (t1:Thing)-[:X]->(a1:SubThing),
(t1)-[:X]->(a2:SubThing),
(t1)-[:X]->(a3:SubThing),
(t1)-[:X]->(a4:SubThing),
(t2:Thing)-[:X]->(b1:SubThing),
(t2)-[:X]->(b2:SubThing),
(t2)-[:X]->(b3:SubThing),
(t3:Thing);
我 运行 可以收到什么匹配命令 table 这样的:
t s
(0:Thing) (3:SubThing)
(0:Thing) (4:SubThing)
(1:Thing) (7:SubThing)
(1:Thing) (8:SubThing)
(2:Thing) null
这是一个控制台。neo4j.org我用来解决这个问题的。
你需要在这里使用一个OPTIONAL MATCH
,通过相同的起始节点聚合并根据子事物的数量对结果进行排序:
MATCH (t:Thing)
OPTIONAL MATCH (t)-[:X]->(s)
RETURN t, count(s) AS degree
ORDER BY degree DESC
LIMIT 2
这可能是最好的方法。我不能展开 collection 否则我会丢失空 :Thing
.
MATCH (t:Thing)
OPTIONAL MATCH (t)-->(s:SubThing)
WITH t, s
ORDER BY id(s)
RETURN t, collect(s)[0..2]
ORDER BY id(t)
它returns这个:
t collect(s)[0..2]
(0:Thing) [(3:SubThing), (4:SubThing)]
(1:Thing) [(7:SubThing), (8:SubThing)]
(2:Thing) []