我有一个neo4j查询,它获取(用户)的所有一级和二级连接,然后作为所有者或室友获取他们的位置。我收集所有的地方和一些其他信息与用户之间的类似关系通过一个案例条款。但是问题是,CASE子句需要超过20秒才能执行查询,这是非常糟糕的。
MATCH (n:User), (n)-[:connected_to*1..2 {status: 1}]-(sp:User),
(sp)<-[:owner_of|house_mate]-(place:Place)
WHERE (ID(n) = {ID_n})
AND NOT(n)<-[:owner_of|house_mate]-(place)
MATCH (place)-[tenant:owner_of|house_mate]->(u:User)
WITH DISTINCT place,
type(tenant) AS type,
u,
CASE
WHEN (n)-[:connected_to {status: 1}]-(u) THEN '1'
WHEN (n)-[:connected_to*1..2 {status: 1}]-(u) THEN '2'
ELSE '3'
END AS connection
WITH place,
collect({type: type, u: u, connection: connection}) AS tenants
RETURN place,
[tenant IN tenants WHERE tenant.type = 'owner_of' | [tenant.u, tenant.connection]][0] AS owner_array,
[tenant IN tenants WHERE tenant.type = 'house_mate' | [tenant.u, tenant.connection]] AS house_mates_array有什么有效的方法来返回用户之间的连接吗??
发布于 2018-02-06 18:27:05
这应该更有效,因为它使用OPTIONAL MATCH执行一次(n)-[:connected_to*1..2 {status: 1}]-(u)搜索(而不是在CASE子句中执行两次非常类似的搜索)。
MATCH (n:user)-[:connected_to*..2 {status: 1}]-(:User)<-[:owner_of|house_mate]-(place:Place)
WHERE ID(n) = {ID_n} AND NOT(n)<-[:owner_of|house_mate]-(place)
MATCH (place)-[tenant:owner_of|house_mate]->(u:User)
OPTIONAL MATCH (n)-[ct:connected_to*..2 {status: 1}]-(u)
WITH place,
collect({
type: type(tenant),
u: u,
connection: CASE SIZE(ct)
WHEN 1 THEN '1'
WHEN 2 THEN '2'
ELSE '3'
END}) AS tenants
RETURN place,
[t IN tenants WHERE t.type = 'owner_of' | [t.u, t.connection]][0] AS owner_array,
[t IN tenants WHERE t.type = 'house_mate' | [t.u, t.connection]] AS house_mates_arrayhttps://stackoverflow.com/questions/48648427
复制相似问题