如何在属性数组中查找公共值

时间:2017-08-07 10:33:21

标签: neo4j cypher

我有一个图表,其中节点有一个属性数组。我想在此属性数组中找到公共值(如果有),然后将其设置为我将在这两个节点之间创建的边的属性

例如,假设图表是:

CREATE (n:Person{name:"A", prop:["1", "2", "3", "4"]})
CREATE (m:Person{name:"B", prop:["5", "4", "2", "7"]})

我想在“A”和“B”之间创建一个边com_edg,因为prop数组的值共有“2”和“4”。此com_edg边缘应具有属性prop:["2", "4"]

2 个答案:

答案 0 :(得分:2)

虽然这不是真正面向图形的,但这绝对是可能的。

MATCH (n:Person {name:"A"}), (n2:Person {name:"B"}) 
RETURN [x IN n.prop WHERE x IN n2.prop] AS common

-

common
[2, 4]

答案 1 :(得分:0)

补充Christophe的答案,在计算nn2之间的公共属性后,您应该CREATE这些节点之间的关系将公共节点数组作为属性传递。< / p>

MATCH (n:Person {name:"A"}), (n2:Person {name:"B"}) 
WITH n, n2, [x IN n.prop WHERE x IN n2.prop] AS common
CREATE (n)-[:com_edge {prop : common}]->(n2)

如果您尝试在图表的所有节点之间创建此关系,则应执行以下操作:

MATCH (n:Person), (n2:Person) 
WHERE ID(n) > ID(n2)
WITH n, n2, [x IN n.prop WHERE x IN n2.prop] AS common
CREATE (n)-[:com_edge {prop : common}]->(n2)

此处使用WHERE ID(n) > ID(n2)来保证查询仅在一个方向上匹配。但请注意,第二个查询非常昂贵,因为它会考虑图中的每对节点。