| | 233 | |
| | 234 | def transitive_objects(self, subject, property, remember=None): |
| | 235 | """Transitively generate objects for the `property` relationship |
| | 236 | |
| | 237 | Generated objects belong to the depth first transitive closure of the |
| | 238 | `property` relationship starting at `subject`. |
| | 239 | """ |
| | 240 | if remember is None: |
| | 241 | remember = {} |
| | 242 | if subject in remember: |
| | 243 | return |
| | 244 | remember[subject] = 1 |
| | 245 | yield subject |
| | 246 | for object in self.objects(subject, property): |
| | 247 | for o in self.transitive_objects(object, property, remember): |
| | 248 | yield o |
| | 249 | |
| | 250 | def transitive_subjects(self, predicate, object, remember=None): |
| | 251 | """Transitively generate objects for the `property` relationship |
| | 252 | |
| | 253 | Generated objects belong to the depth first transitive closure of the |
| | 254 | `property` relationship starting at `subject`. |
| | 255 | """ |
| | 256 | if remember is None: |
| | 257 | remember = {} |
| | 258 | if object in remember: |
| | 259 | return |
| | 260 | remember[object] = 1 |
| | 261 | yield object |
| | 262 | for subject in self.subjects(predicate, object): |
| | 263 | for s in self.transitive_subjects(predicate, subject, remember): |
| | 264 | yield s |