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 如何使CREATE UNIQUE与子查询一起工作?_Neo4j_Alias_Cypher - Fatal编程技术网

Neo4j 如何使CREATE UNIQUE与子查询一起工作?

Neo4j 如何使CREATE UNIQUE与子查询一起工作?,neo4j,alias,cypher,Neo4j,Alias,Cypher,我有这样一个问题: MATCH left, right WHERE (ID(right) IN [1, 2, 3] AND ID(left) IN [4, 5, 6]) WITH left, right LIMIT 1 RETURN left, right UNION MATCH left, right WHERE (ID(right) IN [1, 2, 3] AND ID(left) IN [4, 5, 6]) WITH left, right SKIP 4 LIMI

我有这样一个问题:

MATCH left, right 
WHERE (ID(right) IN [1, 2, 3] AND ID(left) IN [4, 5, 6]) 
WITH left, right 
  LIMIT 1 
RETURN left, right 
UNION MATCH left, right 
WHERE (ID(right) IN [1, 2, 3] AND ID(left) IN [4, 5, 6]) 
WITH left, right 
  SKIP 4 LIMIT 1 
RETURN left, right 
UNION MATCH left, right 
WHERE (ID(right) IN [1, 2, 3] AND ID(left) IN [4, 5, 6]) 
WITH left, right 
  SKIP 8 LIMIT 1 
RETURN left, right
CREATE UNIQUE left-[rel:FRIEND]->right 
RETURN rel;
通常,我只是创建一个数据集,以便稍后在CREATEUNIQUE指令中使用它
显然,这是行不通的——查询分析器说我只能使用RETURN子句一次。
我的问题是-在这种情况下如何组合数据集?我试图分配一个别名并在CreateUnique中使用它-也无法使其工作。我做错了什么?这种情况可能吗?

我可能误解了您的意图,但当我看到您的查询时,我会想到以下几点

首先,这里是对查询的一种修改,它使用
跳过
限制
,而不使用
返回
联合

MATCH left, right
WHERE ID(left) IN [1,2,3] AND ID(right) IN [4,5,6]
WITH left, right 
    LIMIT 1
CREATE UNIQUE left-[rel:FRIEND]->right
WITH [rel] as rels  //If you want to return the relationship later you can put it in a collection and bring it WITH
MATCH left, right
WHERE ID(left) IN [1,2,3] AND ID(right) IN [4,5,6]
WITH left, right, rels 
    SKIP 4 LIMIT 1
CREATE UNIQUE left-[rel:FRIEND]->right
WITH rels + [rel] as rels
MATCH left, right
WHERE ID(left) IN [1,2,3] AND ID(right) IN [4,5,6]
WITH left, right, rels 
    SKIP 8 LIMIT 1
CREATE UNIQUE left-[rel:FRIEND]->right
WITH rels + [rel] as rels
RETURN LENGTH(rels), rels  // You can return the relationships here but SKIP/LIMIT does its job also if you don't return anything
但这个问题有点疯狂。它实际上是三个查询,其中两个被人为地压缩为第一个查询的子查询。它在每个子查询中重新匹配相同的节点,这样运行查询而不是单独运行查询实际上没有任何好处(实际上速度较慢,因为在每个子查询中,您还匹配您知道不会使用的节点)

因此,我的第一个建议是在按id获取节点时使用
START
而不是
MATCH…WHERE
。目前,查询将数据库中的每个节点绑定为“left”,然后将数据库中的每个节点绑定为“right”,然后过滤掉所有绑定为“left”的节点这不符合
WHERE
子句中的条件,对于“right”也是如此。由于查询的这一部分重复了三次,因此数据库中的所有节点总共绑定了六次。这对于建立三种关系来说是昂贵的。如果使用
START
可以立即绑定所需的节点。这并不能真正回答您的问题,但它会更快,查询也会更干净。因此,使用
START
通过节点的内部id获取节点

START left = node(1,2,3), right = node(4,5,6)

我想到的第二件事是匹配模式时节点和“路径”或“结果项”之间的区别。当您在“左”中绑定三个节点,在“右”中绑定其他三个节点时,您没有三个结果项,而是九个。对于“left”中绑定的每个节点,您将得到三个结果,因为有三个可能的“right”可以与之组合。如果你想把每个“左”和每个“右”联系起来,那太好了。但我认为您要查找的是结果项
(1)、(4)
(2)、(5)
(3)、(6)
,尽管在一个查询中使用节点ID集合绑定三个“左”节点和三个“右”节点似乎很方便,但您必须进行所有过滤以消除6个不需要的匹配。查询变得复杂而繁琐,实际上比单独运行查询要慢。另一种说法是说
(1)-[:FRIEND]->(4)
是一个独特的模式,而不是(相关地)连接到您正在创建的其他模式。如果你想创建
(1)-[:FRIEND]->(2)那就不一样了。我不明白你在做什么,但是你的查询中唯一严格非法的返回是create子句之前的返回。如果你删除了它,你的查询会做你所期望的吗?@jjaderberg不,它说union中的所有子查询都必须有相同的列名。这很有意义。但是为什么你以前总是回来?是否正在累积节点,以便可以使用一个create unique子句创建多个关系?Union将为许多查询联合返回,但在您的情况下,您应该能够使用
with
子句收集并携带“left”和“right”,创建关系,最后返回一次,不是吗?@jjaderberg,我也这么认为,是的,直到我发现没有RETURN子句就无法使用LIMIT和/或SKIP语句:(当然可以,它们使用
with
without
RETURN
)。
START left = node(1), right = node(4)
CREATE UNIQUE left-[rel:FRIEND]->right
RETURN rel

START left = node(2), right = node(5)
CREATE UNIQUE left-[rel:FRIEND]->right
RETURN rel

START left = node(3), right = node(6)
CREATE UNIQUE left-[rel:FRIEND]->right
RETURN rel
START left = node({leftId}), right = node({rightId})
CREATE UNIQUE left-[rel:FRIEND]->right
RETURN rel

parameters: {leftId:1, rightId:4}, {leftId:2, rightId:5}, {leftId:3, rightId:6}