Neo4j:由于效率低下而取代CASE条款?

时间:2018-02-06 17:12:50

标签: neo4j cypher

我有一个neo4j查询,它获取所有第一学位和(用户)的2度连接,然后取得他们作为所有者或室友的位置。 我通过CASE子句收集用户之间类似关系的所有地方和一些其他信息。但问题是CASE子句执行时间超过20秒 查询,这真的很糟糕。

export default {
  data: function() {
    return {
      users: usersRef,
      user: {
          name: '',
          email: '', 
      }, 
      users: [{
          name: 'John Doe',
          email: 'john.doe@gmail.com', 
          uid: "should be actual User UID",
      }], 
    };
  },
methods: {
    signUp: function() {
      firebaseApp.auth().createUserWithEmailAndPassword(email.value, password.value).then(function(user) {
                  }, function(error) {
        alert(error.message + error.code);
    });

有没有有效的方法来恢复用户之间的连接?

1 个答案:

答案 0 :(得分:0)

这应该更有效率,因为它使用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