2013-11-24 33 views
0

我看到一个奇怪的问题,即当我运行以下查询时,Cypher查询正在创建多个节点,并且创建的节点数取决于多少个元素查询Neo4J Cypher查询在查询中定义了IN子句时创建了多个节点

MATCH (shipper:Shipper)-[:SHIPS_PRODUCT_TYPE]->(prodType:ProductType) 
WHERE shipper.InternalId = 1 
AND prodType.InternalId IN [11,3,1] 
CREATE (load:Shipment { 
     InternalId: 5, 
     NodeType: "Shipment", 
     Created: "2013-11-24T18:25:12.3179997+05:30", 
     Modified: "0001-01-01T00:00:00+00:00"}) 
RETURN distinct load AS load, shipper AS shipper 

我希望这个查询只返回一行数据,的IN子句中定义,但返回3行作为其创造3“载:装运”节点使用相同的数据

我是否错过了如何使用这个IN子句,因为我甚至没有使用我在这个例子的创建语句匹配?

编辑

BTW我忘了提及,我也试过如下即便如此,我结束了与多个节点

介绍With语句
MATCH (shipper:Shipper)-[:SHIPS_PRODUCT_TYPE]->(prodType:ProductType) 
WHERE shipper.InternalId = 1 
AND prodType.InternalId IN [11,3,1] 
WITH shipper, prodType 
CREATE (shipper)-[:HAS_PUBLISHED]->(load:Shipment { 
     InternalId: 5, 
     NodeType: "Shipment", 
     Created: "2013-11-24T18:25:12.3179997+05:30", 
     Modified: "0001-01-01T00:00:00+00:00"})-[:CONTAINS_PRODUCT]->(prodType) 
RETURN distinct load AS load, shipper AS shipper 

问候 基兰

回答

1

这实际上并不需要IN。你匹配来自你最初的MATCH/WHERE的多个结果,所以它为每个结果创建一个节点。从示例中,我甚至不知道为什么要进行初始查询,因为它根本不在第二部分中使用。我想你的意思是通过关系连接你的新节点?也许你应该查看RC1中的MERGE命令,它可以让你“匹配或创建”节点或关系。

更新:

你可能想使用CREATE UNIQUE或合并,而不是只创建,以避免重复节点。也许这样的事情:

MATCH (shipper:Shipper)-[:SHIPS_PRODUCT_TYPE]->(prodType:ProductType) 
WHERE shipper.InternalId = 1 
AND prodType.InternalId IN [11,3,1] 
WITH shipper, prodType 
CREATE UNIQUE (shipper)-[:HAS_PUBLISHED]->(load:Shipment { 
    InternalId: 5, 
    NodeType: "Shipment", 
    Created: "2013-11-24T18:25:12.3179997+05:30", 
    Modified: "0001-01-01T00:00:00+00:00"}) 
WITH shipper, load, prodType 
CREATE UNIQUE (load)-[:CONTAINS_PRODUCT]->(prodType) 
RETURN distinct load AS load, shipper AS shipper 
+0

我刚刚从我的更大的查询中提取了这个,这就是它没有真正显示意图的原因。我想要做的是首先过滤并获取所需的节点,然后创建一个新节点,然后创建与新创建的节点与其他节点的关联。我也试图在比赛和创造之间使用声明,即使如此,我也得到了相同的结果。你能否帮助我理解在这种情况下究竟发生了什么,它是否为每个匹配路径执行创建? – Kiran

+0

是的,它为匹配上下文中的每个结果创建。 –

+0

在这种情况下,如何写一个查询来实现我所尝试的。即我有托运人和他们处理的一系列产品,当他们发布货物时,他们会提供货物中的产品。在我上面的编辑中,我试图获取托运人和产品,然后尝试将其与我正在创建的新货物相关联。 – Kiran