这个问题来自于SPARQL中CONSTRUCT
运算符的经验,它允许在图形查询中获取变量绑定并返回一个新图形作为结果。
在Cypher / OpenCypher中有类似的东西吗?
我的意思是,假设你有:
react1 - [part-of] -> pathway1
mol1 - [consumed-by] -> react1
mol2 - [consumed-by] -> react1
mol3 - [produced-by] -> react1
我想返回一个简化的图表,如:
pathway1 - [input] - mol1
pathway1 - [input] - mol2
pathway1 - [output] - mol3
请注意,我已经使用WITH/COLLECT/UNWIND
来返回与上图非常相似的JSON结构,但这种方法写起来要困难得多。
你可以使用virtual relationships
来试验APOC library
。
例如,您有以下测试数据:
MERGE p1 = (R:react {name:'react_1'})-[:`part-of`] ->(:pathway {name: 'pathway_1'})
MERGE p2 = (:mol {name: 'mol_1'})-[:`consumed-by`]->(R)
MERGE p3 = (:mol {name: 'mol_2'})-[:`consumed-by`]->(R)
MERGE p4 = (:mol {name: 'mol_3'})-[:`produced-by`]->(R)
RETURN *
然后您可以尝试以下查询:
MATCH (R:react)
MATCH (R)-[rp:`part-of`]-(p:pathway)
MATCH (m:mol)-[mr]-(R)
WITH p, m, mr,
CASE WHEN type(mr) = 'consumed-by'
THEN {from: p, type: "input", props: properties(mr), to: m}
WHEN type(mr) = 'produced-by'
THEN {from: m, type: "output", props: properties(mr), to: p}
END AS vRel
WITH vRel WHERE vRel IS NOT NULL
CALL apoc.create.vRelationship(
vRel.from,
vRel.type,
vRel.props,
vRel.to
) YIELD rel
RETURN vRel.from, rel, vRel.to
什么会得到以下结果: