我正在尝试在neo4j中共享属性的节点之间创建边。 每个节点有5个属性,例如a,b,c,d,e。如果2个节点仅共享属性“a”,则edge将名称设置为“a”。如果2个节点共享属性b,d,e,则edge的名称为“bde”。对于每一对,如果它们共享属性,那么我只想创建一个边。 感谢。
答案 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)
子句阻止m
和n
成为同一个节点,并且还可以防止对同一对进行重复评估。
[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)