合并多种关系类型并从两个关系中返回数据

时间:2019-10-15 09:56:05

标签: neo4j cypher

因此,我目前正在编写一个Cypher查询,我想在其中获取数据库中的所有条目及其关系,以将其导入Cytoscape中进行进一步分析。

我想将两种关系类型组合到一个变量中,对它们使用WHERE操作并返回结果。假设我想根据某人的消费金额(例如珍藏版)或他实际上是否看过这部电影来获取有趣电影的列表。

现在,我的查询如下based on this example

MATCH (p:Person)-[rel:`watched`|`bought`]->(c:Movie)
WHERE
(rel.watch_min >= 50) or (rel.bought_price > 10)
RETURN p, rel, c

现在,在Neo4j浏览器中,此方法有效。但是rel的输出仅具有watched关系的关系属性,而没有合并的关系属性。

查询如何看起来像这样,rel包含watchedbought的两个属性?

我基本上想写的是这样:

MATCH (p:Person)-[r1:`watched`|r2:`bought`]->(c:Movie)
WHERE
(rl.watch_min >= 50) or (r2.bought_price > 10)
RETURN p, r1, r2, c

但不幸的是,这是无效的语法。

1 个答案:

答案 0 :(得分:1)

如果我创建一些示例数据:

CREATE
  (p:Person{id: 123})-[:watched{watch_min: 60}]->(m:Movie{name:'Foo'}),
  (p)-[:bought{bought_price:99}]->(m);

并执行您的第一个查询,我得到以下结果:

╒══════════╤═══════════════════╤══════════════╕
│"p"       │"rel"              │"c"           │
╞══════════╪═══════════════════╪══════════════╡
│{"id":123}│{"bought_price":99}│{"name":"Foo"}│
├──────────┼───────────────────┼──────────────┤
│{"id":123}│{"watch_min":60}   │{"name":"Foo"}│
└──────────┴───────────────────┴──────────────┘

因此,您的查询工作正常,并且返回了两种关系类型。

如果您实际上希望合并一对节点之间所有关系的属性,则可以使用APOC函数apoc.map.mergeList进行合并:

MATCH (p:Person)-[rel:watched|bought]->(c:Movie)
WHERE (rel.watch_min >= 50) OR (rel.bought_price > 10)
RETURN p, c, apoc.map.mergeList(COLLECT(rel)) AS props;

返回此结果:

╒══════════╤══════════════╤══════════════════════════════════╕
│"p"       │"c"           │"props"                           │
╞══════════╪══════════════╪══════════════════════════════════╡
│{"id":123}│{"name":"Foo"}│{"bought_price":99,"watch_min":60}│
└──────────┴──────────────┴──────────────────────────────────┘

但是,如果多个关系具有相同的属性,则这种方法无法控制最终的关系。