2301_76648344 2023-11-21 16:16 采纳率: 20%
浏览 32
已结题

基于路径推理的知识图谱多跳问答(可以帮我补全代码吗)

**任务描述
基于构建的中医食疗知识图谱,输入一个证机概要,使用 DFS 算法遍历知识图谱,输出从证机概要出发的包含疾病、推荐食材、食谱的基于路径的多跳问答序列。

编程要求
输入
证机概要

输出
包含疾病、推荐食材、食谱的基于路径的多跳问答序列

测试说明
平台会对你编写的代码进行测试:

测试输入:
脾胃失和
预期输出:
脾胃失和->郁证->紫菜->仙人掌紫菜降压汤
脾胃失和->郁证->紫菜->紫菜蛋皮卷
脾胃失和->郁证->紫菜->鱼丝紫菜粥
脾胃失和->郁证->芝麻->芝麻丸
脾胃失和->郁证->芝麻->芝麻聪脑汤
脾胃失和->郁证->芝麻->芝麻首乌杞子丸
脾胃失和->郁证->芝麻->百合芝麻煲猪心
脾胃失和->郁证->芝麻->核桃芝麻扁豆泥
脾胃失和->郁证->芝麻->香卤什锦蔬菜
脾胃失和->郁证->羊肝
脾胃失和->郁证->杏仁
脾胃失和->郁证->薤白
脾胃失和->郁证->小麦
脾胃失和->郁证->香橼
脾胃失和->郁证->香附
脾胃失和->郁证->酸枣仁
脾胃失和->郁证->山楂
脾胃失和->郁证->青皮
脾胃失和->郁证->芹菜->蜂蜜芹菜汁
脾胃失和->郁证->芹菜->芹菜橘皮
脾胃失和->郁证->芹菜->花生仁拌芹菜
脾胃失和->郁证->芹菜->芹菜苹果汁
脾胃失和->郁证->芹菜->热饮芹菜汁
脾胃失和->郁证->苹果->藿香苹果茶
脾胃失和->郁证->苹果->苹果蜂蜜饮
脾胃失和->郁证->苹果->猪心苹果卷
脾胃失和->郁证->苹果->苹果甜椒拼盘
脾胃失和->郁证->牛奶
脾胃失和->郁证->玫瑰花
脾胃失和->郁证->玫瑰
脾胃失和->郁证->绿萼梅
脾胃失和->郁证->萝卜->白萝卜炖蜂蜜
脾胃失和->郁证->萝卜->萝卜酸梅汤
脾胃失和->郁证->萝卜->双银汤
脾胃失和->郁证->萝卜->白萝卜煲羊脯
脾胃失和->郁证->龙眼
脾胃失和->郁证->莲子->莲子心甘草茶
脾胃失和->郁证->莲子->菱角莲子红枣羹
脾胃失和->郁证->莲子->山药参枣糯米粥
脾胃失和->郁证->莲子->冬瓜莲子粥
脾胃失和->郁证->莲藕->鲜藕饮
脾胃失和->郁证->莲藕->五样同饮
脾胃失和->郁证->莲藕->藕圆
脾胃失和->郁证->莲藕->莲藕甘蔗汁
脾胃失和->郁证->荔枝->荔枝枣糖
脾胃失和->郁证->荔枝->人参荔枝酒
脾胃失和->郁证->荔枝->荔枝山药莲米粥
脾胃失和->郁证->荔枝->**

#include <bits/stdc++.h>
#define MVNum 10000
using namespace std;

string Relationship[] = {"有功效","有食谱","有推荐食材","有证机概要"};
typedef struct ArcNode {
    int adjvex;                     // 该边所指向顶点的位置
    int relationship;               // 表示边的类型,即关系的类型,对应为数组下标 
    struct ArcNode* nextarc;        // 下一条边
} ArcNode;                          // 边结点

string Entity[]= {"食材","疾病","功效","食谱","证机概要"};
typedef struct VNode {
    int entity;                     // 表示顶点的类型,即实体的类型,对应为数组下标
    string info;                    // 表示顶点的内容,即实体的内容
    ArcNode* firstarc;              // 指向第一条依附该顶点的边的指针
} VNode, AdjList[MVNum];

typedef struct {
    AdjList vertices;               // 邻接表
    int vexnum, arcnum;             // 图的当前顶点数和边数
} ALGraph;

int LocateVex(ALGraph& G, string str) {
// 返回str在AdjList中的位置
for (int i = 0; i < G.vexnum; i++) {
        if (G.vertices[i].info == str) {
            return i;
        }
    }
    return -1; // 如果找不到,返回 -1 表示错误
}

int LocateEntity(string str) {
// 返回str在Entity数组中的位置
for (int i = 0; i < sizeof(Entity) / sizeof(Entity[0]); i++) {
        if (Entity[i] == str) {
            return i;
        }
    }
    return -1; // 如果找不到,返回 -1 表示错误
}

int LocateRelationship(string str) {
// 返回str在Relationship数组中的位置
for (int i = 0; i < sizeof(Relationship) / sizeof(Relationship[0]); i++) {
        if (Relationship[i] == str) {
            return i;
        }
    }
    return -1; // 如果找不到,返回 -1 表示错误
}

void InitALGraph(ALGraph& G) {
// 初始化邻接表
G.vexnum = 0;
    G.arcnum = 0;
    for (int i = 0; i < MVNum; i++) {
        G.vertices[i].entity = -1;          // 初始化顶点的类型为 -1,表示错误
        G.vertices[i].info = "";            // 初始化顶点的内容为空字符串
        G.vertices[i].firstarc = nullptr;   // 初始化顶点的边指针为空
    }
}

void CreateAdjList(ALGraph& G, string filename) {
// 从filename中按顺序读取实体存入邻接表
ifstream infile(filename);
    if (!infile) {
        perror("Load");
        exit(0);
    }
    string s1,s2;
    while (infile >> s1>>s2) {
        G.vertices[G.vexnum].info = s1;
        G.vertices[G.vexnum].entity = LocateEntity(s2);
        G.vertices[G.vexnum++].firstarc = NULL;
    }
   infile.close();
}

void CreateUDG(ALGraph& G, string filename) {
// 从filename中按顺序三元组存入邻接表
    ifstream file(filename);
    if (!file) {
        perror("Load");
        exit(0);
    }
    string s1, s2, s3;
    while (file >> s1 >> s2 >> s3) {
        int i = LocateVex(G, s1);
        int j = LocateVex(G, s3); 
        ArcNode *p1 = new ArcNode;
        p1->adjvex = j;
        p1->relationship = LocateRelationship(s2);
        p1->nextarc = G.vertices[i].firstarc;
        G.vertices[i].firstarc = p1;
        ArcNode* p2 = new ArcNode;
        p2->adjvex = i;
        p2->relationship = LocateRelationship(s2);
        p2->nextarc = G.vertices[j].firstarc;
        G.vertices[j].firstarc = p2;
    }
    file.close();
}

void DFS(ALGraph& G, int i, bool visited[], string path) {
// 深度优先搜索多跳问答路径,i为输入的证机概要在AdjList中的下标,path为问答路径
// 函数可增加额外的参数
    
}

void QuestionAnswering(ALGraph& G, string symptom) {
// 调用DFS函数,遍历图G,输出问答序列,symptom为证机概要
    
}
int main() {
    ALGraph G;
    InitALGraph(G);
    CreateAdjList(G, "/data/workspace/myshixun/3.1.1-基于路径推理的知识图谱多跳问答/entity.txt");
    CreateUDG(G, "/data/workspace/myshixun/3.1.1-基于路径推理的知识图谱多跳问答/relationship.txt");
    string symptom;
    cin >> symptom;
    QuestionAnswering(G, symptom);
    return 0;
}
  • 写回答

9条回答 默认 最新

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月22日
  • 创建了问题 11月21日

悬赏问题

  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络