如何在 neo4j 中的节点之间创建条件边?
How to create conditional edge among nodes in neo4j?
我正在尝试在 neo4j 中共享属性的节点之间创建边。
每个节点都有 5 个属性,比如 a、b、c、d、e。如果 2 个节点仅共享 属性 'a',则边的名称将是 'a'。如果 2 个节点共享属性 b、d、e,则边的名称为 'bde'。对于每一对,如果它们共享属性,那么我只想创建一条边。
谢谢。
此查询应与 属性 的 name
建立 FOO
关系,该关系在每对节点(共享任何 属性 值)之间具有相同的值):
MATCH (m), (n)
WHERE ID(m) < ID(n)
WITH m, n, [x IN KEYS(m) WHERE m[x] = n[x] | x] AS common_keys
FOREACH (k IN common_keys | CREATE (m)-[:FOO {name: k}]->(m))
WHERE ID(m) < ID(n)
子句防止m
和n
成为同一个节点,也防止对同一对进行重复计算。
[更新]
如果您只想在 2 个节点之间建立一个 FOO
关系,即使它们共享多个 属性 值,那么此查询应该有效:
MATCH (m), (n)
WHERE ID(m) < ID(n)
WITH m, n,
REDUCE(s = '', k IN KEYS(m) | CASE m[k] WHEN n[k] THEN s + k ELSE s END) AS common_keys
WHERE common_keys <> ''
CREATE (m)-[:FOO {name: common_keys}]->(m)
我正在尝试在 neo4j 中共享属性的节点之间创建边。 每个节点都有 5 个属性,比如 a、b、c、d、e。如果 2 个节点仅共享 属性 'a',则边的名称将是 'a'。如果 2 个节点共享属性 b、d、e,则边的名称为 'bde'。对于每一对,如果它们共享属性,那么我只想创建一条边。 谢谢。
此查询应与 属性 的 name
建立 FOO
关系,该关系在每对节点(共享任何 属性 值)之间具有相同的值):
MATCH (m), (n)
WHERE ID(m) < ID(n)
WITH m, n, [x IN KEYS(m) WHERE m[x] = n[x] | x] AS common_keys
FOREACH (k IN common_keys | CREATE (m)-[:FOO {name: k}]->(m))
WHERE ID(m) < ID(n)
子句防止m
和n
成为同一个节点,也防止对同一对进行重复计算。
[更新]
如果您只想在 2 个节点之间建立一个 FOO
关系,即使它们共享多个 属性 值,那么此查询应该有效:
MATCH (m), (n)
WHERE ID(m) < ID(n)
WITH m, n,
REDUCE(s = '', k IN KEYS(m) | CASE m[k] WHEN n[k] THEN s + k ELSE s END) AS common_keys
WHERE common_keys <> ''
CREATE (m)-[:FOO {name: common_keys}]->(m)