Получение разветвленных данных / графических данных

#python #json #database #graph

#python #json #База данных #График

Вопрос:

Допустим, у меня есть следующие данные, и я хочу найти все под названием «иммунодефициты».

 startNode - relationship - endNode
immunodeficiencies - includes - B cell disorders
B cell disorders - includes - Bruton Agammaglobulinemia
B cell disorders - includes - Hyper-IgM syndrome
immunodeficiencies - includes - T cell disorders
T cell disorders - includes - DiGeorge Syndrome
immunodeficiencies - includes - combined B and T cell disorders
combined B and T cell disorders - includes - Ataxia-Telangiectasia
 

Как бы я это сделал? Данные находятся в формате JSON, так что это так {"startNode": "immunodeficiencies", "relationship": "includes", "endNode": "B cell disorders"}

Только для одной не вложенной категории это было легко. Я сделал следующее:

 for x in range(len(peds_diseaseR))
if peds_diseaseR[x]["startNode"] == "immunodeficiencies" amp;amp; peds_diseaseR[x]["relationship"] == "includes":
    List.append(x)
 

Для вложенной болезни я действительно потерян. Я чувствую, что, возможно, мне нужна рекурсивная функция, но я понятия не имею. Я собирался ввести код, который я написал, но я чувствую, что это было бы более запутанным, чем что-либо, и это не работает.

РЕДАКТИРОВАТЬ: только что добавил это, но это не работает.

 var endNodes = []

func findEndNodes(start):
    for x in range(len(peds_diseaseR)):
        if peds_diseaseR[x]["startNode"] == start amp;amp; peds_diseaseR[x]["relationship"] == "includes":
            endNodes.append(peds_diseaseR[x]["endNode"])
        if endNodes != []:
            for disease in endNodes:
                findEndNodes(disease)
    print(endNodes)
    return endNodes
 

Комментарии:

1. Каковы различные отношения? Существуют ли другие отношения, кроме includes существующих?

2. О, и func не является ключевым словом python. Ключевое слово, которое вы ищете здесь, это def

3. О, извините. На самом деле я использую gdscript, который в основном является python с некоторыми незначительными отличиями. func будучи одним из них

4. И да, существуют другие отношения, отличные от includes! hx (имеется в виду история), pe (имеется в виду физический осмотр) и tx (имеется в виду лечение)

Ответ №1:

Вы очень близки. Всего лишь небольшая реорганизация, и вы найдете решение:

 peds_diseaseR = [] 
def findEndNodes(start):
    
    # declared inside the function, because you need a fresh one for every recursion
    childnodes = [] 
    for relationship in peds_diseaseR:
        if relationship["startNode"] == start amp;amp; relationship["relationship"] == "includes":
            disease = relationship["endNode"]
            child_nodes.append(disease) 
            # If you process it now, you do not need to check if you have values in your list. 
            # Thus, less code, but more importantly, less states your code can be in.
            # It is very easy to get lost trying to make a mental map when doing recursion. 
            # Keep it as simple as possible! 
            recursion_nodes = findEndNodes(disease)
            child_nodes.extend(recursion_nodes)
    print(child_nodes)
    return child_nodes
 

Как вы можете видеть, я заменил только func на def , и я удалил var ключевое слово. Этого не существует в python. Вы просто присваиваете значение. Существует небольшая, но тонкая разница между append и extend . extend append все значения будут в списке.

Комментарии:

1. ВАУ, большое вам спасибо за это!! Особенно для комментариев. Очень полезно!