链接到多个并行子图匹配
Chaining to multiple parallel subgraph matches
我有一个包含多个锻炼节点的图表。每个锻炼节点都与多种媒体、锻炼类型和 body 焦点节点相关。
以下各个查询均按预期工作并给出预期结果:
1) Return 组锻炼和每个媒体:
MATCH (w:Workout)-[:hasMedia]->(m:Media) RETURN w.name as workout, collect(m.url) AS media
2) Return 组锻炼和每个锻炼类型:
MATCH (w:Workout)-[:hasConcept]->(wt:Concept)-[:ofType]->(Category{name:"training"}) RETURN w.name AS workout, collect(wt.name) AS workoutType
3) Return 组锻炼和每个锻炼的 body 重点:
MATCH (w:Workout)-[:hasConcept]->(bf:Concept)-[:ofType]->(Category{name:"bodyfocus"}) RETURN w.name AS workout, collect(bf.name) AS bodyFocus
此外,我有一组与锻炼相关的人员节点。
以下查询按预期工作并给出预期结果:
A) Return 一组与特定人相关的锻炼及其原因(分数、证据):
MATCH (Person{personId:"1028"})-[r:hasAffinity]->(c:Concept)<-[s]-(w:Workout) RETURN sum(toFloat(r.score)*toFloat(s.score))/count(c) AS score, w.name AS workout, collect({text:c.name, polarity:r.score, evidenceId:c.name}) AS evidence
我正在尝试做的(并且惨败)是得到一个单一的复合查询来回答以下问题:"return the set of relevant workouts for a person, with score, evidence, media, workout types, and body focuses for each workout".
我似乎想要:匹配{A 的路径} WITH w MATCH w-{其余 1 的路径},w-{其余 2 的路径},w-{其余 3 的路径} RETURN {A 的东西}、{1 的东西}、{2 的东西}、{3 的东西}
...但我无法让它发挥作用(而且作为新手,这种方法无论如何都可能是错误的)。帮忙?
我认为这就是您需要在一个查询中组合所有内容的方法:
// get the Workouts of a Person via the Concept
MATCH (p:Person {personId:"1028"})-[r:hasAffinity]->(c:Concept)<-[s]-(w:Workout)
// take the Person and Workout to the next step, calculate score and collect evidence
WITH DISTINCT p, w, sum(toFloat(r.score)*toFloat(s.score))/count(c) AS score,
collect({text:c.name, polarity:r.score, evidenceId:c.name}) AS evidence
// Match everything else for the workout
MATCH (w)-[:hasConcept]->(wt:Concept)-[:ofType]->(:Category {name:"training"})
MATCH (w)-[:hasConcept]->(bf:Concept)-[:ofType]->(:Category {name:"bodyfocus"})
MATCH (w)-[:hasMedia]->(m:Media)
// Return everything (score and evidence are available from the WITH statement)
RETURN p.personID, w.name AS workout, collect(wt.name) AS workoutType,
collect(bf.name) AS bodyFocus, collect(m.url) AS media, score, evidence
我有一个包含多个锻炼节点的图表。每个锻炼节点都与多种媒体、锻炼类型和 body 焦点节点相关。
以下各个查询均按预期工作并给出预期结果:
1) Return 组锻炼和每个媒体:
MATCH (w:Workout)-[:hasMedia]->(m:Media) RETURN w.name as workout, collect(m.url) AS media
2) Return 组锻炼和每个锻炼类型:
MATCH (w:Workout)-[:hasConcept]->(wt:Concept)-[:ofType]->(Category{name:"training"}) RETURN w.name AS workout, collect(wt.name) AS workoutType
3) Return 组锻炼和每个锻炼的 body 重点:
MATCH (w:Workout)-[:hasConcept]->(bf:Concept)-[:ofType]->(Category{name:"bodyfocus"}) RETURN w.name AS workout, collect(bf.name) AS bodyFocus
此外,我有一组与锻炼相关的人员节点。
以下查询按预期工作并给出预期结果:
A) Return 一组与特定人相关的锻炼及其原因(分数、证据):
MATCH (Person{personId:"1028"})-[r:hasAffinity]->(c:Concept)<-[s]-(w:Workout) RETURN sum(toFloat(r.score)*toFloat(s.score))/count(c) AS score, w.name AS workout, collect({text:c.name, polarity:r.score, evidenceId:c.name}) AS evidence
我正在尝试做的(并且惨败)是得到一个单一的复合查询来回答以下问题:"return the set of relevant workouts for a person, with score, evidence, media, workout types, and body focuses for each workout".
我似乎想要:匹配{A 的路径} WITH w MATCH w-{其余 1 的路径},w-{其余 2 的路径},w-{其余 3 的路径} RETURN {A 的东西}、{1 的东西}、{2 的东西}、{3 的东西}
...但我无法让它发挥作用(而且作为新手,这种方法无论如何都可能是错误的)。帮忙?
我认为这就是您需要在一个查询中组合所有内容的方法:
// get the Workouts of a Person via the Concept
MATCH (p:Person {personId:"1028"})-[r:hasAffinity]->(c:Concept)<-[s]-(w:Workout)
// take the Person and Workout to the next step, calculate score and collect evidence
WITH DISTINCT p, w, sum(toFloat(r.score)*toFloat(s.score))/count(c) AS score,
collect({text:c.name, polarity:r.score, evidenceId:c.name}) AS evidence
// Match everything else for the workout
MATCH (w)-[:hasConcept]->(wt:Concept)-[:ofType]->(:Category {name:"training"})
MATCH (w)-[:hasConcept]->(bf:Concept)-[:ofType]->(:Category {name:"bodyfocus"})
MATCH (w)-[:hasMedia]->(m:Media)
// Return everything (score and evidence are available from the WITH statement)
RETURN p.personID, w.name AS workout, collect(wt.name) AS workoutType,
collect(bf.name) AS bodyFocus, collect(m.url) AS media, score, evidence