JSON для генеалогического дерева Neo4J и React Tree Graph - PullRequest
0 голосов
/ 25 мая 2020

Я использую Neo4J для управления генеалогическим деревом, я хочу получить 3 поколения человека и отобразить его в библиотеке React Tree Graph. Нужная мне структура JSON будет выглядеть так:

{
  "name": "Alex Statham",
  "people": [
    {
      "name": "Jason Statham",
      "people": [
        {
          "name": "Lyna Statham"
        },
        {
          "name": "John Statham"
        }
      ]
    },
    {
      "name": "Will Statham",
      "people": [
        {
          "name": "Michael Statham"
        }
      ]
    }
  ]
}

Это мое генеалогическое древо в Neo4J:

https://i.imgur.com/zey1JI8.png

Это мой запрос на создание этого генеалогического древа:

create (bn1:Person{maBN:1,name:"Anna William",address:"American"})
create (bn2:Person{maBN:2,name:"Jason Statham",address:"American"})
create (bn3:Person{maBN:3,name:"Lyna Statham",address:"American"})
create (bn4:Person{maBN:4,name:"John Statham",address:"American"})
create (bn5:Person{maBN:5,name:"Alex Statham",address:"American"})
create (bn6:Person{maBN:6,name:"Will Statham",address:"American"})
create (bn7:Person{maBN:7,name:"Michael Statham",address:"American"})

MATCH (a:Person),(b:Person),(c:Person),(d:Person)
WHERE a.name contains 'Jason' AND b.name contains 'Anna' and c.name contains 'John' and d.name contains 'Lyna'
CREATE (b)-[:PARENT_OF {type: 'natural'}]->(c)
CREATE (a)-[:PARENT_OF {type: 'natural'}]->(c)
CREATE (b)-[:PARENT_OF {type: 'natural'}]->(d)
CREATE (a)-[:PARENT_OF {type: 'natural'}]->(d)
RETURN a, b, c ,d

MATCH (a:Person),(b:Person)
WHERE a.name contains 'Jason' AND b.name contains 'Anna'
CREATE (a)-[:SPOUSE_OF {type:'marriage'}]->(b)
CREATE (b)-[:SPOUSE_OF {type:'marriage'}]->(a)
RETURN a, b

MATCH (a:Person),(b:Person)
WHERE a.name contains 'Alex' AND b.name contains 'Jason' 
CREATE (a)-[:PARENT_OF {type:'natural'}]->(b)
RETURN a, b

MATCH (a:Person),(b:Person)
WHERE a.name contains 'Alex' AND b.name = 'Will Statham' 
CREATE (a)-[:PARENT_OF {type:'adopted child'}]->(b)
RETURN a, b

MATCH (a:Person),(b:Person)
WHERE a.name='Will Statham' AND b.name contains 'Michael' 
CREATE (a)-[:PARENT_OF {type:'step'}]->(b)
RETURN a, b

Я пробовал несколько таких запросов и процедур:

//Test 1 (It lacks a brother'child and of course it not return a JSON)
Match (otherssubchild)-[a:PARENT_OF]-(othersubchild)-[:PARENT_OF]-(otherchild)-[:PARENT_OF]-(parent)-[:PARENT_OF]-(b:Person)-[:PARENT_OF]-(children)-[:PARENT_OF]-(subchild)
where b.name contains 'Jason' 
return parent,b,children,subchild,otherchild,othersubchild,otherssubchild

//Test 2 (It return a JSON but it not actually right and It wrong because start Node p1, p1 will always display like the oldest person)
MATCH (p1:Person {maBN:2})
CALL apoc.path.spanningTree(p1, {
    sequence: '>Person,PARENT_OF,>Person,PARENT_OF,>Person',
    maxLevel: 3
}) YIELD path
With collect(path) as R
Call apoc.convert.toTree(R) yield value
return value

//Test 3 (It looks good but is only true in the case of not indicating whose generation and in most cases is wrong.)
Match (a:Person)<-[:PARENT_OF]-(b:Person)<-[:PARENT_OF]-(c:Person) 
WITH a,b,{name:c.name} as gen1 
WITH a,{name:b.name, people:collect(gen1)} as gen2 
WITH a,{name:a.name, people:collect(gen2)} as tree 
return tree 

Но ни один из них не соответствует действительности. Что мне нужно сделать, чтобы JSON идеально подходил для библиотеки? Пожалуйста, помогите мне!

Большое спасибо и извините за мой плохой Engli sh!

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Возможно, вы захотите следовать стандартам GEDCOM или GEDCOMx. Это будет включать как минимум людей (INDV), союзы (FAMS) и размещение (PLA C) узлов. Вы можете увидеть, как я отрендерил это в Neo4j в этом сообщении в блоге. . Я выполняю ETL из GEDCOM или (запросы моей SQL Server) базы данных в Neo4j, используя файлы CSV и метод LOAD CSV для Neo4j. Но вы также можете выполнить ETL через JSON. Моя основная задача - рассмотреть вашу схему Neo4j; сейчас это выглядит слишком ограниченным.

0 голосов
/ 26 мая 2020

Думаю, этот запрос может работать для вашего конкретного случая c. Тем не менее, сообщение в блоге, упомянутое @ david-a-stumpf, содержит множество отличных материалов, которые следует учитывать.

MATCH path = (:Person {name: "Alex Statham"})-[:PARENT_OF*1..3]->(:Person)
With collect(path) as R
Call apoc.convert.toTree(R) yield value
return value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...