NEO4J:由于效率低下而替换案例条款



我有一个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

最新更新