Neo4j 不可见书面条款的影响

Neo4j 不可见书面条款的影响,neo4j,cypher,Neo4j,Cypher,使用Neo4j 3.0.4 如果路径上存在可选匹配项,则希望有条件地创建顶点: with [ {customer: 0001, created: 1474434591, version: "1.0.0"}, {customer: 0001, created: 1474434500, version: "1.0.0"}, {customer: 0003, created: 1474445743, version: "1.1.0"} ] as lines unwind lines as li

使用Neo4j 3.0.4

如果路径上存在可选匹配项,则希望有条件地创建顶点:

with [
 {customer: 0001, created: 1474434591, version: "1.0.0"},
 {customer: 0001, created: 1474434500, version: "1.0.0"},
 {customer: 0003, created: 1474445743, version: "1.1.0"}
] as lines 
unwind lines as line
/// customers above already exist
MATCH (c:Customer {id: line.customer})
OPTIONAL MATCH (c)-[:HAS]->(co:Configuration) WHERE co.created >= line.created
WITH CASE WHEN co IS NULL THEN
  [1]
END as createInventory,
CASE WHEN co IS NOT NULL THEN 
  [count(co)]
END as throwError, c, line
FOREACH (x in createInventory |
  CREATE (n:Configuration {
   created: line.created,
   version: line.version
  })
  CREATE UNIQUE (c)-[:HAS]->(n)
)
FOREACH (x in throwError |
  CREATE (e:Error:Inventory { message: "Configuration " + line.created + " >= existing (" + x + ")" })
);
预期只会创建2个
配置
顶点,并与
客户
关联。而是创建所有3个
配置
实例。write语句(即create)位于同一事务中,因此我假设在循环通过
可选匹配时不会反映单个写操作。在本例中,一行是
配置
,如果创建的属性比现有属性旧,我不想创建绑定到同一
客户
的新行。因此,
可选项中的谓词匹配

是否有条件地创建并考虑同一事务(或Cypher语句)中的写操作?

Cypher从不“循环”到前面的子句

您可以在
UNWIND
子句之后插入此子句,以获得预期效果:

WITH
  line.customer AS lc,
  REDUCE(s = NULL, x IN COLLECT(line) | CASE WHEN s IS NULL OR x.created > s.created THEN x ELSE s END) AS line
WITH
子句根据不同的
行。customer
值获取创建的
值最高的
行,删除任何其他行。(这是“每位客户”的原因是因为使用了)

顺便说一句,您的查询使用
CREATE UNIQUE
而不是
CREATE
是没有意义的,因为您刚才创建的
n
节点是全新的,因此指定的模式以前不可能存在。

Cypher从不“循环”到前面的子句

您可以在
UNWIND
子句之后插入此子句,以获得预期效果:

WITH
  line.customer AS lc,
  REDUCE(s = NULL, x IN COLLECT(line) | CASE WHEN s IS NULL OR x.created > s.created THEN x ELSE s END) AS line
WITH
子句根据不同的
行。customer
值获取创建的
值最高的
行,删除任何其他行。(这是“每位客户”的原因是因为使用了)


顺便说一句,您的查询使用
CREATE UNIQUE
而不是
CREATE
,没有任何意义,因为您刚才创建的
n
节点是全新的,因此指定的模式以前不可能存在。

您说您“如果创建的属性比现有属性旧,则不希望创建绑定到同一客户的新属性”,但您的
co.created>=line.created
测试似乎只允许您说不需要的属性。是否有错误,或者我误解了?@cybersam lines数组中第二个元素中创建的属性为”比第一行旧。第一行创建客户和配置顶点之间的HAS关系。可选匹配应在第二行返回null。这是我的期望。您说“如果创建的属性比现有属性旧,则不希望创建绑定到同一客户的新属性”“,但是您的
co.created>=line.created
测试似乎只允许您说不需要的测试。是否有错误,或者我误解了?@cybersam线条数组中第二个元素中创建的属性比第一个元素“旧”。第一行创建客户和配置顶点之间的HAS关系。可选匹配项应在第二行返回null。这是我的期望。@cypersam,隐式分组,当结果集的最后一部分是聚合时。酷。当结果集的最后一部分是聚合时,您的解决方案即使在加载时也能很好地发挥作用。@cypersam,隐式group by。酷。即使有负载,您的解决方案也能很好地发挥作用。