원클릭으로
transcript-queries
Cypher query patterns for Transcript nodes. Reference doc auto-loaded by neo4j-transcript agent.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Cypher query patterns for Transcript nodes. Reference doc auto-loaded by neo4j-transcript agent.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Predict stock direction post 8-K earnings & refine using 10-Q/10-K outcomes
Predict stock direction after an 8-K earnings release from a prebuilt earnings context bundle
Post-event causal attribution — explains why a stock moved after 8-K earnings, compares against prediction, writes reusable lessons for future predictions. Production invocation via SDK embed (main session), not fork.
Core Neo4j schema reference with all labels, relationships, data types, and indexes. Use when exploring database structure, checking field types, or understanding the financial knowledge graph schema.
V1105_LONGDESC_START_MARKER. This skill tests v2.1.105's skill-description cap raise from 250 to 1536 characters. If this description appears truncated in the skill listing system-reminder at around character 250, the cap was not raised; if it appears truncated at around 1536, the cap was raised correctly per changelog. The test sentinel markers are placed at specific character offsets: V1105_OFFSET_100 is at char 100 approximately, V1105_OFFSET_300 is at char 300 approximately (old cap would truncate this), V1105_OFFSET_700 is at char 700 approximately, V1105_OFFSET_1000 is at char 1000, V1105_OFFSET_1200 is at char 1200, V1105_OFFSET_1400 is at char 1400, and V1105_END_MARKER is the last visible sentinel. This description also contains deliberately redundant filler to reach the target length without substantive content since the purpose is only to verify truncation behavior rather than to provide meaningful guidance. filler filler filler filler filler filler filler filler filler filler filler filler filler
Child skill for v2.1.107 nesting retest — writes marker and returns
| name | transcript-queries |
| description | Cypher query patterns for Transcript nodes. Reference doc auto-loaded by neo4j-transcript agent. |
| user-invocable | false |
Queries for Transcript, QAExchange, PreparedRemark, and related content.
| Label | Count | Key properties | Relationship |
|---|---|---|---|
| FullTranscriptText | 28 | content | Transcript-[:HAS_FULL_TEXT]-> |
| QuestionAnswer | 37 | content, speaker_roles | Transcript-[:HAS_QA_SECTION]-> |
Note: Company-[:HAS_TRANSCRIPT]->Transcript (4,192) links companies to their earnings calls.
MATCH (t:Transcript)-[:INFLUENCES]->(c:Company {ticker: $ticker})
RETURN t.id, t.conference_datetime, t.fiscal_quarter, t.fiscal_year, t.company_name
ORDER BY t.conference_datetime DESC
MATCH (t:Transcript)-[:INFLUENCES]->(c:Company {ticker: $ticker})
WHERE t.conference_datetime >= $start_date AND t.conference_datetime <= $end_date
RETURN t.id, t.conference_datetime, t.fiscal_quarter, t.fiscal_year
ORDER BY t.conference_datetime
MATCH (t:Transcript)-[:INFLUENCES]->(c:Company {ticker: $ticker})
RETURN t.id, t.conference_datetime, t.fiscal_quarter, t.fiscal_year
ORDER BY t.conference_datetime DESC
LIMIT 1
MATCH (t:Transcript {id: $transcript_id})-[:HAS_QA_EXCHANGE]->(qa:QAExchange)
RETURN qa.questioner, qa.questioner_title, qa.responders, qa.responder_title, qa.exchanges
ORDER BY toInteger(qa.sequence)
MATCH (t:Transcript {id: $transcript_id})-[:HAS_QA_EXCHANGE]->(qa:QAExchange)
RETURN qa.questioner, qa.questioner_title, qa.exchanges
ORDER BY toInteger(qa.sequence)
SKIP $offset
LIMIT $limit
MATCH (t:Transcript {id: $transcript_id})-[:HAS_QA_EXCHANGE]->(first:QAExchange)
WHERE first.sequence = '1'
MATCH path = (first)-[:NEXT_EXCHANGE*0..10]->(qa:QAExchange)
RETURN qa.sequence, qa.questioner, qa.exchanges
ORDER BY toInteger(qa.sequence)
MATCH (t:Transcript)-[:INFLUENCES]->(c:Company {ticker: $ticker})
MATCH (t)-[:HAS_QA_EXCHANGE]->(qa:QAExchange)
WHERE qa.questioner CONTAINS $analyst_name
RETURN t.conference_datetime, qa.questioner, qa.questioner_title, qa.exchanges
ORDER BY t.conference_datetime DESC
MATCH (t:Transcript {id: $transcript_id})-[:HAS_PREPARED_REMARKS]->(pr:PreparedRemark)
RETURN pr.content
MATCH (t:Transcript {id: $transcript_id})-[:HAS_FULL_TEXT]->(ft:FullTranscriptText)
RETURN ft.content
CALL db.index.fulltext.queryNodes('qa_exchange_ft', $query)
YIELD node, score
RETURN node.questioner, node.exchanges, score
ORDER BY score DESC
LIMIT 20
CALL db.index.fulltext.queryNodes('qa_exchange_ft', $query)
YIELD node, score
MATCH (t:Transcript)-[:HAS_QA_EXCHANGE]->(node)
MATCH (t)-[:INFLUENCES]->(c:Company {ticker: $ticker})
RETURN t.conference_datetime, node.questioner, node.exchanges, score
ORDER BY score DESC
LIMIT 20
CALL db.index.fulltext.queryNodes('prepared_remarks_ft', $query)
YIELD node, score
RETURN substring(node.content, 0, 500), score
ORDER BY score DESC
LIMIT 10
CALL db.index.fulltext.queryNodes('full_transcript_ft', $query)
YIELD node, score
RETURN substring(node.content, 0, 500), score
ORDER BY score DESC
LIMIT 10
CALL db.index.vector.queryNodes('qaexchange_vector_idx', $k, $embedding)
YIELD node, score
RETURN node.questioner, node.exchanges, score
ORDER BY score DESC
CALL db.index.vector.queryNodes('qaexchange_vector_idx', $k, $embedding)
YIELD node, score
MATCH (t:Transcript)-[:HAS_QA_EXCHANGE]->(node)
MATCH (t)-[:INFLUENCES]->(c:Company {ticker: $ticker})
RETURN t.conference_datetime, node.questioner, node.exchanges, score
ORDER BY score DESC
MATCH (t:Transcript)-[r:INFLUENCES]->(c:Company {ticker: $ticker})
WHERE t.conference_datetime >= $start_date AND t.conference_datetime <= $end_date
RETURN t.id, t.conference_datetime,
r.daily_stock, r.daily_industry, r.daily_sector, r.daily_macro
ORDER BY t.conference_datetime
MATCH (qa1:QAExchange)-[:NEXT_EXCHANGE]->(qa2:QAExchange)
WHERE qa1.questioner IS NOT NULL AND qa2.questioner IS NOT NULL
RETURN qa1.questioner, qa1.sequence, qa2.questioner, qa2.sequence, qa1.transcript_id
LIMIT 20
MATCH (qa:QAExchange) WHERE qa.embedding IS NOT NULL
RETURN COUNT(qa) as embedded_qa_count
MATCH (qa:QAExchange) WHERE qa.embedding IS NOT NULL
RETURN qa.questioner, qa.sequence, qa.transcript_id LIMIT 20
MATCH (qa:QAExchange) WHERE qa.embedding IS NOT NULL
WITH qa, SIZE(qa.embedding) as embedding_size
RETURN COUNT(qa) as qa_with_embeddings, MIN(embedding_size) as min_size, MAX(embedding_size) as max_size
LIMIT 1
MATCH (c:Company)-[:HAS_TRANSCRIPT]->(t:Transcript)
WHERE datetime(t.created) > datetime() - duration('P90D')
RETURN c.ticker, t.company_name, t.conference_datetime, t.fiscal_quarter
ORDER BY t.created DESC LIMIT 20
MATCH (c:Company)-[:HAS_TRANSCRIPT]->(t:Transcript)
WHERE t.conference_datetime IS NOT NULL
RETURN c.ticker, t.company_name, t.conference_datetime, t.fiscal_quarter, t.fiscal_year
ORDER BY t.conference_datetime DESC LIMIT 20
MATCH (c:Company)-[:HAS_TRANSCRIPT]->(t:Transcript)
WHERE datetime(t.created) > datetime() - duration('P90D')
RETURN c.ticker, t.company_name, t.conference_datetime, t.fiscal_quarter, t.fiscal_year
ORDER BY t.created DESC LIMIT 20
MATCH (t:Transcript)-[rel:INFLUENCES]->(c:Company)
WHERE rel.daily_stock < -3.0
AND rel.daily_stock IS NOT NULL
RETURN c.ticker, t.conference_datetime,
rel.daily_stock as stock_return,
rel.daily_macro as market_return,
rel.daily_stock - rel.daily_macro as excess_return
ORDER BY rel.daily_stock
LIMIT 20
MATCH (t:Transcript)-[rel:INFLUENCES]->(c:Company)
WHERE rel.session_stock > 5.0
AND rel.session_stock IS NOT NULL
RETURN c.ticker, t.conference_datetime,
rel.session_stock as session_return,
rel.daily_stock as daily_return
ORDER BY rel.session_stock DESC
LIMIT 20
MATCH (c:Company)-[:HAS_TRANSCRIPT]->(t:Transcript)
WHERE datetime(t.conference_datetime) > datetime() - duration('P30D')
RETURN c.ticker, c.name, t.conference_datetime,
t.fiscal_quarter, t.fiscal_year
ORDER BY datetime(t.conference_datetime) DESC
LIMIT 20
Queries for PIT (Point-in-Time) mode. All use <= $pit (boundary-inclusive) and return the standard envelope format. Pass pit in the params dict alongside other Cypher parameters.
MATCH (t:Transcript)-[:INFLUENCES]->(c:Company {ticker: $ticker})
WHERE t.conference_datetime >= $start_date AND t.conference_datetime <= $pit
WITH t ORDER BY t.conference_datetime DESC
WITH collect({
available_at: t.conference_datetime,
available_at_source: 'neo4j_created',
company_name: t.company_name,
conference_datetime: t.conference_datetime,
fiscal_quarter: t.fiscal_quarter,
fiscal_year: t.fiscal_year
}) AS items
RETURN items AS data, [] AS gaps
MATCH (t:Transcript)-[:INFLUENCES]->(c:Company {ticker: $ticker})
WHERE t.conference_datetime <= $pit
WITH t ORDER BY t.conference_datetime DESC LIMIT 1
WITH collect({
available_at: t.conference_datetime,
available_at_source: 'neo4j_created',
company_name: t.company_name,
conference_datetime: t.conference_datetime,
fiscal_quarter: t.fiscal_quarter,
fiscal_year: t.fiscal_year
}) AS items
RETURN items AS data, [] AS gaps
MATCH (t:Transcript)-[:INFLUENCES]->(c:Company {ticker: $ticker})
WHERE t.conference_datetime <= $pit
WITH t ORDER BY t.conference_datetime DESC LIMIT 1
MATCH (t)-[:HAS_QA_EXCHANGE]->(qa:QAExchange)
WITH t, qa ORDER BY toInteger(qa.sequence)
WITH collect({
available_at: t.conference_datetime,
available_at_source: 'neo4j_created',
sequence: qa.sequence,
questioner: qa.questioner,
responders: qa.responders,
exchanges: qa.exchanges,
conference_datetime: t.conference_datetime
}) AS items
RETURN items AS data, [] AS gaps
CALL db.index.fulltext.queryNodes('qa_exchange_ft', $query)
YIELD node, score
MATCH (node)<-[:HAS_QA_EXCHANGE]-(t:Transcript)-[:INFLUENCES]->(c:Company {ticker: $ticker})
WHERE t.conference_datetime <= $pit
WITH t, node, score ORDER BY score DESC LIMIT 20
WITH collect({
available_at: t.conference_datetime,
available_at_source: 'neo4j_created',
sequence: node.sequence,
questioner: node.questioner,
responders: node.responders,
exchanges: node.exchanges,
conference_datetime: t.conference_datetime,
ft_score: score
}) AS items
RETURN items AS data, [] AS gaps
t.conference_datetime <= $pit (boundary-inclusive; items at PIT are valid)INFLUENCES relationship without aliasing (not HAS_TRANSCRIPT) — matches gold standardavailable_at: t.conference_datetime and available_at_source: 'neo4j_created'collect({...}) to produce data[] arrayRETURN items AS data, [] AS gapspit in the params dict alongside other Cypher parameters{"data":[],"gaps":[]} passes the gateINFLUENCES: Has return data (daily_stock, session_stock, hourly_stock, daily_macro, etc.)HAS_TRANSCRIPT: Navigation only (no properties). Use for simple lookups.Transcript.conference_datetime is an ISO string.QAExchange.sequence is a String; use toInteger() for ordering.QAExchange.exchanges contains the full Q&A text as a string.QAExchange.embedding is a float[] for vector search.daily_industry but daily_stock is NULL.qa_exchange_ft, prepared_remarks_ft, full_transcript_ft.qaexchange_vector_idx on QAExchange.embedding.NEXT_EXCHANGE relationship chains Q&A exchanges in order.| Date | Gap | Affected | Mitigation |
|---|---|---|---|
| 2026-01-11 | Common user error: wrong schema for transcripts | Transcript queries | Use :INFLUENCES or :HAS_TRANSCRIPT (not :COMPANY), conference_datetime (not event_datetime), :HAS_QA_EXCHANGE (not :HAS_EXCHANGE), :QAExchange (not :Exchange), :PreparedRemark (not :PreparedRemarks). |
Version 1.2 | 2026-02-15 | Fixed PIT queries: t.title→t.company_name, qa.speaker→qa.questioner+qa.responders