我有一个neo4j查询,可获取所有一级&(用户(的2级连接,然后以所有者或室友的身份获取其位置。我正在通过案例子句收集用户之间的所有位置和其他一些信息。但是问题是,案例条款需要超过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
是否有任何有效的方法来返回用户之间的连接??
这应该更有效,因为它使用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_array