如何在neo4j中的节点之间创建条件边?

时间:2017-10-19 17:08:19

标签: neo4j cypher graph-databases py2neo

我正在尝试在neo4j中共享属性的节点之间创建边。 每个节点有5个属性,例如a,b,c,d,e。如果2个节点仅共享属性“a”,则edge将名称设置为“a”。如果2个节点共享属性b,d,e,则edge的名称为“bde”。对于每一对,如果它们共享属性,那么我只想创建一个边。 感谢。

1 个答案:

答案 0 :(得分:3)

此查询应与属性的FOO建立name关系,该属性在每对节点(共享任何属性值)之间具有相同的值:

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)子句阻止mn成为同一个节点,并且还可以防止对同一对进行重复评估。

[UPDATE]

如果您只想在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)