gonum.org/v1/gonum@v0.14.0/graph/formats/rdf/equi_canonical_example_test.go (about) 1 // Copyright ©2021 The Gonum Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package rdf_test 6 7 import ( 8 "fmt" 9 "strings" 10 11 "gonum.org/v1/gonum/graph/formats/rdf" 12 ) 13 14 func ExampleLean() { 15 for i, statements := range []string{ 16 0: ` 17 _:author1 <ex:contributesTo> _:go . 18 _:author2 <ex:contributesTo> _:go . 19 _:author2 <ex:contributesTo> _:gonum . 20 _:author3 <ex:contributesTo> _:gonum . 21 `, 22 1: ` 23 _:author1 <ex:contributesTo> _:go . 24 _:author2 <ex:contributesTo> _:go . 25 _:author2 <ex:contributesTo> _:gonum . 26 _:author3 <ex:contributesTo> _:gonum . 27 _:gonum <ex:dependsOn> _:go . 28 `, 29 2: ` 30 _:author1 <ex:contributesTo> _:go . 31 _:author1 <ex:notContributesTo> _:gonum . 32 _:author2 <ex:contributesTo> _:go . 33 _:author2 <ex:contributesTo> _:gonum . 34 _:author3 <ex:contributesTo> _:gonum . 35 _:gonum <ex:dependsOn> _:go . 36 `, 37 3: ` 38 _:author1 <ex:is> "Alice" . 39 _:author1 <ex:contributesTo> _:go . 40 _:author2 <ex:contributesTo> _:go . 41 _:author2 <ex:contributesTo> _:gonum . 42 _:author3 <ex:contributesTo> _:gonum . 43 _:gonum <ex:dependsOn> _:go . 44 `, 45 4: ` 46 _:author1 <ex:contributesTo> _:go . 47 _:author1 <ex:notContributesTo> _:gonum . 48 _:author2 <ex:contributesTo> _:go . 49 _:author2 <ex:contributesTo> _:gonum . 50 _:author3 <ex:contributesTo> _:gonum . 51 _:author3 <ex:notContributesTo> _:go . 52 _:gonum <ex:dependsOn> _:go . 53 `, 54 5: ` 55 _:author1 <ex:is> "Alice" . 56 _:author2 <ex:is> "Bob" . 57 _:author1 <ex:contributesTo> _:go . 58 _:author2 <ex:contributesTo> _:go . 59 _:author2 <ex:contributesTo> _:gonum . 60 _:author3 <ex:contributesTo> _:gonum . 61 _:gonum <ex:dependsOn> _:go . 62 `, 63 6: ` 64 _:author1 <ex:is> "Alice" . 65 _:author2 <ex:is> "Bob" . 66 _:author3 <ex:is> "Charlie" . 67 _:author1 <ex:contributesTo> _:go . 68 _:author2 <ex:contributesTo> _:go . 69 _:author2 <ex:contributesTo> _:gonum . 70 _:author3 <ex:contributesTo> _:gonum . 71 _:gonum <ex:dependsOn> _:go . 72 `, 73 } { 74 // Decode the statement stream. 75 dec := rdf.NewDecoder(strings.NewReader(statements)) 76 var s []*rdf.Statement 77 for { 78 l, err := dec.Unmarshal() 79 if err != nil { 80 break 81 } 82 s = append(s, l) 83 } 84 85 // Lean the graph to remove redundant statements. 86 lean, err := rdf.Lean(s) 87 if err != nil { 88 fmt.Println(err) 89 } 90 91 // Canonicalize the blank nodes in-place. 92 _, err = rdf.URDNA2015(lean, lean) 93 if err != nil { 94 fmt.Println(err) 95 continue 96 } 97 98 fmt.Printf("%d:\n", i) 99 for _, s := range lean { 100 fmt.Println(s) 101 } 102 fmt.Println() 103 } 104 105 // Output: 106 // 107 // 0: 108 // _:c14n0 <ex:contributesTo> _:c14n1 . 109 // 110 // 1: 111 // _:c14n0 <ex:contributesTo> _:c14n1 . 112 // _:c14n0 <ex:contributesTo> _:c14n2 . 113 // _:c14n2 <ex:dependsOn> _:c14n1 . 114 // 115 // 2: 116 // _:c14n0 <ex:contributesTo> _:c14n1 . 117 // _:c14n0 <ex:contributesTo> _:c14n3 . 118 // _:c14n2 <ex:contributesTo> _:c14n1 . 119 // _:c14n2 <ex:notContributesTo> _:c14n3 . 120 // _:c14n3 <ex:dependsOn> _:c14n1 . 121 // 122 // 3: 123 // _:c14n0 <ex:contributesTo> _:c14n1 . 124 // _:c14n0 <ex:contributesTo> _:c14n3 . 125 // _:c14n2 <ex:contributesTo> _:c14n1 . 126 // _:c14n2 <ex:is> "Alice" . 127 // _:c14n3 <ex:dependsOn> _:c14n1 . 128 // 129 // 4: 130 // _:c14n0 <ex:contributesTo> _:c14n1 . 131 // _:c14n0 <ex:contributesTo> _:c14n2 . 132 // _:c14n2 <ex:dependsOn> _:c14n1 . 133 // _:c14n3 <ex:contributesTo> _:c14n1 . 134 // _:c14n3 <ex:notContributesTo> _:c14n2 . 135 // _:c14n4 <ex:contributesTo> _:c14n2 . 136 // _:c14n4 <ex:notContributesTo> _:c14n1 . 137 // 138 // 5: 139 // _:c14n1 <ex:contributesTo> _:c14n0 . 140 // _:c14n1 <ex:contributesTo> _:c14n3 . 141 // _:c14n1 <ex:is> "Bob" . 142 // _:c14n2 <ex:contributesTo> _:c14n0 . 143 // _:c14n2 <ex:is> "Alice" . 144 // _:c14n3 <ex:dependsOn> _:c14n0 . 145 // 146 // 6: 147 // _:c14n0 <ex:dependsOn> _:c14n1 . 148 // _:c14n2 <ex:contributesTo> _:c14n0 . 149 // _:c14n2 <ex:contributesTo> _:c14n1 . 150 // _:c14n2 <ex:is> "Bob" . 151 // _:c14n3 <ex:contributesTo> _:c14n1 . 152 // _:c14n3 <ex:is> "Alice" . 153 // _:c14n4 <ex:contributesTo> _:c14n0 . 154 // _:c14n4 <ex:is> "Charlie" . 155 }