Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 这个密码查询非常慢,有优化吗?_Neo4j_Cypher - Fatal编程技术网

Neo4j 这个密码查询非常慢,有优化吗?

Neo4j 这个密码查询非常慢,有优化吗?,neo4j,cypher,Neo4j,Cypher,使用Neo4J 2.1.5 数据: 2000人 目标:计算每个人的朋友、朋友的朋友、朋友的朋友的朋友总数。 结果如下: 个人全名|好友总数|好友-2总数|好友-3总数|全局总数 MATCH (person:Person) WITH person OPTIONAL MATCH person-[:KNOWS]-(p2:Person) WITH person, count(p2) as f1 OPTIONAL MATCH path = shortestPath(person-[:KNOWS*..2]-

使用Neo4J 2.1.5

数据:

2000人
目标:计算每个人的朋友、朋友的朋友、朋友的朋友的朋友总数。
结果如下:
个人全名|好友总数|好友-2总数|好友-3总数|全局总数

MATCH (person:Person)
WITH person
OPTIONAL MATCH person-[:KNOWS]-(p2:Person)
WITH person, count(p2) as f1
OPTIONAL MATCH path = shortestPath(person-[:KNOWS*..2]-(f2:Person))
WHERE length(path) = 2
WITH count(nodes(path)[-1]) AS f2, person, f1
OPTIONAL MATCH path = shortestPath(person-[:KNOWS*..3]-(f3:Person))
WHERE length(path) = 3
WITH count(nodes(path)[-1]) AS f3, person, f2, f1
RETURN person._firstName + " " + person._lastName, f1, f2, f3, f1+f2+f3 AS total
诀窍是避免使用圆图进行错误计算;这就是我使用
最短路径的原因

但是,此查询持续时间很长:60秒! 任何可能的优化?

[编辑]

这对你有用吗

MATCH (person:Person)
OPTIONAL MATCH (person)-[:KNOWS]-(p1:Person)
WITH person, COALESCE(COLLECT(p1),[]) AS p1s 
WITH person, CASE p1s WHEN [] THEN [NULL] ELSE p1s END AS p1s
UNWIND p1s AS p1
OPTIONAL MATCH (p1)-[:KNOWS]-(p2:Person)
WHERE NOT ((p2 = person) OR (p2 IN p1s))
WITH person, p1s, COALESCE(COLLECT(DISTINCT p2),[]) AS p2s
WITH person, p1s, CASE p2s WHEN [] THEN [NULL] ELSE p2s END AS p2s UNWIND p2s AS p2
OPTIONAL MATCH (p2)-[:KNOWS]-(p3:Person)
WHERE NOT ((p3 = person) OR (p3 IN p1s) OR (p3 IN p2s))
WITH person,
  CASE p1s WHEN [NULL] THEN 0 ELSE SIZE(p1s) END AS f1,
  CASE p2s WHEN [NULL] THEN 0 ELSE SIZE(p2s) END AS f2,
  COUNT(DISTINCT p3) AS f3
RETURN person.firstName + " " + person.lastName, f1, f2, f3, f1+f2+f3 AS total;
每个朋友只算一次


下面是对一些比较模糊的战术的解释。查询必须将空的
p1s
p2s
集合替换为
[NULL]
,以便
展开
不会中止查询的其余部分。然后,在计算集合的大小时,我们需要给
[NULL]
集合一个
0
的计数

f1是正确的,但它不会为f2和f3返回良好的结果。我希望f2为51,但它返回73。添加一个
distinct
COLLECT(distinct p2)
有帮助,但它仍然是53而不是51。您确定额外的2个人无效吗?将最后一个
替换为
,将当前的
RETURN
子句替换为
RETURN*
。这将向您显示所有集合。我已在我的答案中添加了
DISTINCT
。谢谢。实际上它返回49而不是51。我在OP中的查询没有一些限制。。。