因此,我目前正在编写一个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
包含watched
和bought
的两个属性?
我基本上想写的是这样:
MATCH (p:Person)-[r1:`watched`|r2:`bought`]->(c:Movie)
WHERE
(rl.watch_min >= 50) or (r2.bought_price > 10)
RETURN p, r1, r2, c
但不幸的是,这是无效的语法。
答案 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}│
└──────────┴──────────────┴──────────────────────────────────┘
但是,如果多个关系具有相同的属性,则这种方法无法控制最终的关系。