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及其查询语言cypher。 我有一个遵循相同模式的多重查询 我正在对SQL数据库和Neo4J进行比较 在我的Neo4J数据库中,我有一种类型的标签人和一种类型的关系友谊。此人有适当的人名、姓名、电子邮件、电话。 现在我想拥有n度的朋友。我还想过滤掉那些学历较低的朋友。 例如,如果我想搜索3度的朋友,我想过滤掉那些也是一级和/或二级朋友的朋友 这里是我的查询类型: MATCH (me:person {personID:'1'})-[:FRIENDSHIP*3]-(frien

我现在开始使用Neo4J及其查询语言cypher。 我有一个遵循相同模式的多重查询

我正在对SQL数据库和Neo4J进行比较

在我的Neo4J数据库中,我有一种类型的标签人和一种类型的关系友谊。此人有适当的人名、姓名、电子邮件、电话。 现在我想拥有n度的朋友。我还想过滤掉那些学历较低的朋友。 例如,如果我想搜索3度的朋友,我想过滤掉那些也是一级和/或二级朋友的朋友

这里是我的查询类型:

MATCH (me:person {personID:'1'})-[:FRIENDSHIP*3]-(friends:person)
WHERE NOT (me:person)-[:FRIENDSHIP]-(friends:person)
AND NOT (me:person)-[:FRIENDSHIP*2]-(friends:person)
RETURN COUNT(DISTINCT friends);
我在某处发现了类似的东西

这个查询有效

我的问题是,如果我寻求更高程度的友谊和/或如果人数变得更多,这种查询模式的速度会慢很多


如果有人能帮我优化一下,我会非常感激的

如果您只想处理深度为3的情况,则应返回距离为3度但不小于3度的不同节点:

MATCH (me:person {personID:'1'})-[:FRIENDSHIP]-(f1:person)-[:FRIENDSHIP]-(f2:person)-[:FRIENDSHIP]-(f3:person)
RETURN apoc.coll.subtract(COLLECT(f3), COLLECT(f1) + COLLECT(f2) + me) AS result;
上面的查询使用APOC函数从结果中删除不需要的节点。该函数还确保集合包含不同的元素

下面的查询更一般,只要替换*后面的数字,就可以用于任何给定的深度。例如,此查询的深度为4:

MATCH p=(me:person {personID:'1'})-[:FRIENDSHIP*4]-(:person)
WITH NODES(p)[0..-1] AS priors, LAST(NODES(p)) AS candidate
UNWIND priors AS prior
RETURN apoc.coll.subtract(COLLECT(DISTINCT candidate), COLLECT(DISTINCT prior)) AS result;

Cypher的可变长度关系匹配的问题是,它正在寻找所有可能达到该深度的路径。当您感兴趣的只是某些深度的节点而不是它们的路径时,这可能会导致不必要的性能问题

使用“NODE_GLOBAL”唯一性是在包含深度匹配节点的更有效方法

使用“NODE_GLOBAL”唯一性时,在遍历过程中只访问一次节点。因此,当我们将路径扩展器的minLevel和maxLevel设置为相同时,结果是该级别上的节点在任何较低级别上都不存在,这正是您试图获得的结果

安装APOC后尝试此查询:

MATCH (me:person {personID:'1'})
CALL apoc.path.expandConfig(me, {uniqueness:'NODE_GLOBAL', minLevel:4, maxLevel:4}) YIELD path
// a single path for each node at depth 4 but not at any lower depth
RETURN COUNT(path)
当然,当你有机会的时候,你会想要参数化你的输入personID,level