import re import pytest import rdflib TRIPLE = ( rdflib.URIRef("http://example.com/s"), rdflib.RDFS.label, rdflib.Literal("example 1"), ) def test_empty(): g = rdflib.Graph() s = g.serialize(format="trig") assert s is not None def test_repeat_triples(): g = rdflib.ConjunctiveGraph() g.get_context("urn:a").add( (rdflib.URIRef("urn:1"), rdflib.URIRef("urn:2"), rdflib.URIRef("urn:3")) ) g.get_context("urn:b").add( (rdflib.URIRef("urn:1"), rdflib.URIRef("urn:2"), rdflib.URIRef("urn:3")) ) assert len(g.get_context("urn:a")) == 1 assert len(g.get_context("urn:b")) == 1 s = g.serialize(format="trig", encoding="latin-1") assert b"{}" not in s # no empty graphs! def test_same_subject(): g = rdflib.ConjunctiveGraph() g.get_context("urn:a").add( (rdflib.URIRef("urn:1"), rdflib.URIRef("urn:p1"), rdflib.URIRef("urn:o1")) ) g.get_context("urn:b").add( (rdflib.URIRef("urn:1"), rdflib.URIRef("urn:p2"), rdflib.URIRef("urn:o2")) ) assert len(g.get_context("urn:a")) == 1 assert len(g.get_context("urn:b")) == 1 s = g.serialize(format="trig", encoding="latin-1") assert len(re.findall(b"p1", s)) == 1 assert len(re.findall(b"p2", s)) == 1 assert b"{}" not in s # no empty graphs! def test_remember_namespace(): g = rdflib.ConjunctiveGraph() g.add(TRIPLE + (rdflib.URIRef("http://example.com/graph1"),)) # In 4.2.0 the first serialization would fail to include the # prefix for the graph but later serialize() calls would work. first_out = g.serialize(format="trig", encoding="latin-1") second_out = g.serialize(format="trig", encoding="latin-1") assert b"@prefix ns1: ." in second_out assert b"@prefix ns1: ." in first_out def test_graph_qname_syntax(): g = rdflib.ConjunctiveGraph() g.add(TRIPLE + (rdflib.URIRef("http://example.com/graph1"),)) out = g.serialize(format="trig", encoding="latin-1") assert b"ns1:graph1 {" in out def test_graph_uri_syntax(): g = rdflib.ConjunctiveGraph() # getQName will not abbreviate this, so it should serialize as # a '<...>' term. g.add(TRIPLE + (rdflib.URIRef("http://example.com/foo."),)) out = g.serialize(format="trig", encoding="latin-1") assert b" {" in out def test_blank_graph_identifier(): g = rdflib.ConjunctiveGraph() g.add(TRIPLE + (rdflib.BNode(),)) out = g.serialize(format="trig", encoding="latin-1") graph_label_line = out.splitlines()[-4] assert re.match(rb"^_:[a-zA-Z0-9]+ \{", graph_label_line) def test_graph_parsing(): # should parse into single default graph context data = """ . """ g = rdflib.ConjunctiveGraph() g.parse(data=data, format="trig") assert len(list(g.contexts())) == 1 # should parse into single default graph context data = """ . { . } """ g = rdflib.ConjunctiveGraph() g.parse(data=data, format="trig") assert len(list(g.contexts())) == 1 # should parse into 2 contexts, one default, one named data = """ . { . } { . } """ g = rdflib.ConjunctiveGraph() g.parse(data=data, format="trig") assert len(list(g.contexts())) == 2 @pytest.mark.xfail( raises=AssertionError, reason=""" This is failing because conjuncitve graph assigns things in the default graph to a graph with a bnode as name. On every parse iteration a new BNode is generated resulting in the default graph content appearing multipile times in the output.""", ) def test_round_trips(): data = """ . { . } { . } """ g = rdflib.ConjunctiveGraph() for i in range(5): g.parse(data=data, format="trig") data = g.serialize(format="trig") # output should only contain 1 mention of each resource/graph name assert data.count("thing_a") == 1 assert data.count("thing_b") == 1 assert data.count("thing_c") == 1 assert data.count("thing_d") == 1 assert data.count("thing_e") == 1 assert data.count("thing_f") == 1 assert data.count("graph_a") == 1 def test_default_graph_serializes_without_name(): data = """ . { . } """ g = rdflib.ConjunctiveGraph() g.parse(data=data, format="trig") data = g.serialize(format="trig", encoding="latin-1") assert b"None" not in data def test_prefixes(): data = """ @prefix ns1: . = { ns1:Person_A a ns1:Person ; ns1:TextSpan "Simon" . } = { ns1:Person_C a ns1:Person ; ns1:TextSpan "Agnes" . } """ cg = rdflib.ConjunctiveGraph() cg.parse(data=data, format="trig") data = cg.serialize(format="trig", encoding="latin-1") assert "ns2: ".encode("latin-1") not in data, data assert "ns2:document1".encode("latin-1") in data, data def test_issue_2154(): ds = rdflib.Dataset() sg = ds.serialize(format="trig") assert "prefix" not in sg, sg