2023-10-27 02:44:30 +00:00
|
|
|
from typing import List, Optional
|
|
|
|
|
2024-01-02 21:47:11 +00:00
|
|
|
from langchain_community.graphs.graph_document import Node as BaseNode
|
|
|
|
from langchain_community.graphs.graph_document import Relationship as BaseRelationship
|
docs[patch], templates[patch]: Import from core (#14575)
Update imports to use core for the low-hanging fruit changes. Ran
following
```bash
git grep -l 'langchain.schema.runnable' {docs,templates,cookbook} | xargs sed -i '' 's/langchain\.schema\.runnable/langchain_core.runnables/g'
git grep -l 'langchain.schema.output_parser' {docs,templates,cookbook} | xargs sed -i '' 's/langchain\.schema\.output_parser/langchain_core.output_parsers/g'
git grep -l 'langchain.schema.messages' {docs,templates,cookbook} | xargs sed -i '' 's/langchain\.schema\.messages/langchain_core.messages/g'
git grep -l 'langchain.schema.chat_histry' {docs,templates,cookbook} | xargs sed -i '' 's/langchain\.schema\.chat_history/langchain_core.chat_history/g'
git grep -l 'langchain.schema.prompt_template' {docs,templates,cookbook} | xargs sed -i '' 's/langchain\.schema\.prompt_template/langchain_core.prompts/g'
git grep -l 'from langchain.pydantic_v1' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.pydantic_v1/from langchain_core.pydantic_v1/g'
git grep -l 'from langchain.tools.base' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.tools\.base/from langchain_core.tools/g'
git grep -l 'from langchain.chat_models.base' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.chat_models.base/from langchain_core.language_models.chat_models/g'
git grep -l 'from langchain.llms.base' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.llms\.base\ /from langchain_core.language_models.llms\ /g'
git grep -l 'from langchain.embeddings.base' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.embeddings\.base/from langchain_core.embeddings/g'
git grep -l 'from langchain.vectorstores.base' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.vectorstores\.base/from langchain_core.vectorstores/g'
git grep -l 'from langchain.agents.tools' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.agents\.tools/from langchain_core.tools/g'
git grep -l 'from langchain.schema.output' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.schema\.output\ /from langchain_core.outputs\ /g'
git grep -l 'from langchain.schema.embeddings' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.schema\.embeddings/from langchain_core.embeddings/g'
git grep -l 'from langchain.schema.document' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.schema\.document/from langchain_core.documents/g'
git grep -l 'from langchain.schema.agent' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.schema\.agent/from langchain_core.agents/g'
git grep -l 'from langchain.schema.prompt ' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.schema\.prompt\ /from langchain_core.prompt_values /g'
git grep -l 'from langchain.schema.language_model' {docs,templates,cookbook} | xargs sed -i '' 's/from langchain\.schema\.language_model/from langchain_core.language_models/g'
```
2023-12-12 00:49:10 +00:00
|
|
|
from langchain_core.pydantic_v1 import BaseModel, Field
|
2023-10-26 01:47:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Property(BaseModel):
|
|
|
|
"""A single property consisting of key and value"""
|
|
|
|
|
|
|
|
key: str = Field(..., description="key")
|
|
|
|
value: str = Field(..., description="value")
|
|
|
|
|
|
|
|
|
|
|
|
class Node(BaseNode):
|
|
|
|
properties: Optional[List[Property]] = Field(
|
|
|
|
None, description="List of node properties"
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class Relationship(BaseRelationship):
|
|
|
|
properties: Optional[List[Property]] = Field(
|
|
|
|
None, description="List of relationship properties"
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class KnowledgeGraph(BaseModel):
|
|
|
|
"""Generate a knowledge graph with entities and relationships."""
|
|
|
|
|
|
|
|
nodes: List[Node] = Field(..., description="List of nodes in the knowledge graph")
|
|
|
|
rels: List[Relationship] = Field(
|
|
|
|
..., description="List of relationships in the knowledge graph"
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def format_property_key(s: str) -> str:
|
|
|
|
words = s.split()
|
|
|
|
if not words:
|
|
|
|
return s
|
|
|
|
first_word = words[0].lower()
|
|
|
|
capitalized_words = [word.capitalize() for word in words[1:]]
|
|
|
|
return "".join([first_word] + capitalized_words)
|
|
|
|
|
|
|
|
|
|
|
|
def props_to_dict(props) -> dict:
|
|
|
|
"""Convert properties to a dictionary."""
|
|
|
|
properties = {}
|
|
|
|
if not props:
|
|
|
|
return properties
|
|
|
|
for p in props:
|
|
|
|
properties[format_property_key(p.key)] = p.value
|
|
|
|
return properties
|
|
|
|
|
|
|
|
|
|
|
|
def map_to_base_node(node: Node) -> BaseNode:
|
|
|
|
"""Map the KnowledgeGraph Node to the base Node."""
|
|
|
|
properties = props_to_dict(node.properties) if node.properties else {}
|
|
|
|
# Add name property for better Cypher statement generation
|
|
|
|
properties["name"] = node.id.title()
|
|
|
|
return BaseNode(
|
|
|
|
id=node.id.title(), type=node.type.capitalize(), properties=properties
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def map_to_base_relationship(rel: Relationship) -> BaseRelationship:
|
|
|
|
"""Map the KnowledgeGraph Relationship to the base Relationship."""
|
|
|
|
source = map_to_base_node(rel.source)
|
|
|
|
target = map_to_base_node(rel.target)
|
|
|
|
properties = props_to_dict(rel.properties) if rel.properties else {}
|
|
|
|
return BaseRelationship(
|
|
|
|
source=source, target=target, type=rel.type, properties=properties
|
|
|
|
)
|