Thanks for your responses, I've attached some pictures of the data model to give you a better idea.
Lisa: I tried your approach but unfortunately the facts are always returning null even though they exist in the model. I'm not sure why?
START person=node({id})
MATCH path = person-[:PARENT|CHILD|COUPLE]-(rel:Relationship)-[:PARENT|CHILD|COUPLE*]-(person2:Person), rel-[:FACT]->(fact), person2-[:NAME_FORM]-name
WITH FILTER(r in NODES(path) WHERE r:Relationship) AS relNodes, RELATIONSHIPS(path) AS rels, TAIL(FILTER(p in NODES(path) WHERE p:Person)) AS people, fact, name
RETURN relNodes, EXTRACT(r in relNodes | id(r)) AS relNodesId, collect(fact), LAST(EXTRACT(r in rels | type(r))) AS RelType, people, EXTRACT(p in people | id(p)) AS peopleId, collect(name)
Michael: I'm trying your approach but the change in the latest version to OPTIONAL MATCH has broken a lot of things so I'll reply back once I've gotten everything working again.
Thanks for your help,
Rory