90 lines
2.2 KiB
Go
90 lines
2.2 KiB
Go
|
|
package knowledge
|
||
|
|
|
||
|
|
import "strings"
|
||
|
|
|
||
|
|
type DerivedTags struct {
|
||
|
|
Relevance []string `json:"relevance"`
|
||
|
|
Recency []string `json:"recency"`
|
||
|
|
}
|
||
|
|
|
||
|
|
type Evidence struct {
|
||
|
|
URL string `json:"url"`
|
||
|
|
Snippet string `json:"snippet"`
|
||
|
|
Query string `json:"query,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
type Node struct {
|
||
|
|
ID string `json:"id"`
|
||
|
|
Label string `json:"label"`
|
||
|
|
NodeKind string `json:"nodeKind"` // pain | knowledge | cause | symptom
|
||
|
|
Type string `json:"type"` // core | cause | symptom | mechanism
|
||
|
|
Layer int `json:"layer"`
|
||
|
|
Relation string `json:"relation,omitempty"`
|
||
|
|
PlacementValue string `json:"placementValue,omitempty"` // high | medium | low
|
||
|
|
ProductFitScore int `json:"productFitScore"`
|
||
|
|
SelectedForScan bool `json:"selectedForScan"`
|
||
|
|
Evidence []Evidence `json:"evidence"`
|
||
|
|
DerivedTags DerivedTags `json:"derivedTags"`
|
||
|
|
}
|
||
|
|
|
||
|
|
type Edge struct {
|
||
|
|
From string `json:"from"`
|
||
|
|
To string `json:"to"`
|
||
|
|
Relation string `json:"relation"`
|
||
|
|
}
|
||
|
|
|
||
|
|
type BraveSource struct {
|
||
|
|
Query string `json:"query"`
|
||
|
|
Snippet string `json:"snippet"`
|
||
|
|
URL string `json:"url"`
|
||
|
|
Title string `json:"title,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
type Graph struct {
|
||
|
|
Seed string `json:"seed"`
|
||
|
|
Nodes []Node `json:"nodes"`
|
||
|
|
Edges []Edge `json:"edges"`
|
||
|
|
BraveSources []BraveSource `json:"braveSources"`
|
||
|
|
PainTagCount int `json:"painTagCount"`
|
||
|
|
}
|
||
|
|
|
||
|
|
func IsPainNode(node Node) bool {
|
||
|
|
switch strings.TrimSpace(node.NodeKind) {
|
||
|
|
case "pain", "symptom", "cause":
|
||
|
|
return true
|
||
|
|
default:
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func CountPainTagCandidates(nodes []Node) int {
|
||
|
|
count := 0
|
||
|
|
for _, node := range nodes {
|
||
|
|
if !IsPainNode(node) {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
if len(node.DerivedTags.Relevance) > 0 || len(node.DerivedTags.Recency) > 0 {
|
||
|
|
count++
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return count
|
||
|
|
}
|
||
|
|
|
||
|
|
func TotalTagCandidates(nodes []Node) int {
|
||
|
|
count := 0
|
||
|
|
for _, node := range nodes {
|
||
|
|
count += len(node.DerivedTags.Relevance) + len(node.DerivedTags.Recency)
|
||
|
|
}
|
||
|
|
return count
|
||
|
|
}
|
||
|
|
|
||
|
|
func NodeByID(nodes []Node, id string) (Node, bool) {
|
||
|
|
id = strings.TrimSpace(id)
|
||
|
|
for _, node := range nodes {
|
||
|
|
if node.ID == id {
|
||
|
|
return node, true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return Node{}, false
|
||
|
|
}
|