Skip to content

Commit 3129143

Browse files
add implicit relation info if needed when materialising attributes (#5180)
1 parent 09f0e80 commit 3129143

File tree

4 files changed

+27
-19
lines changed

4 files changed

+27
-19
lines changed

server/src/graql/reasoner/atom/binary/AttributeAtom.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import grakn.core.concept.Label;
2828
import grakn.core.concept.answer.ConceptMap;
2929
import grakn.core.concept.thing.Attribute;
30+
import grakn.core.concept.thing.Relation;
31+
import grakn.core.concept.type.Role;
3032
import grakn.core.concept.type.Rule;
3133
import grakn.core.concept.type.SchemaConcept;
3234
import grakn.core.concept.type.Type;
@@ -327,16 +329,23 @@ public Stream<Predicate> getInnerPredicates(){
327329
return Stream.concat(super.getInnerPredicates(), getMultiPredicate().stream());
328330
}
329331

330-
private void attachAttribute(Concept owner, Attribute attribute){
332+
private Relation attachAttribute(Concept owner, Attribute attribute){
331333
//check if link exists
332334
if (owner.asThing().attributes(attribute.type()).noneMatch(a -> a.equals(attribute))) {
333335
if (owner.isEntity()) {
334-
EntityImpl.from(owner.asEntity()).attributeInferred(attribute);
336+
return EntityImpl.from(owner.asEntity()).attributeInferred(attribute);
335337
} else if (owner.isRelation()) {
336-
RelationImpl.from(owner.asRelation()).attributeInferred(attribute);
338+
return RelationImpl.from(owner.asRelation()).attributeInferred(attribute);
337339
} else if (owner.isAttribute()) {
338-
AttributeImpl.from(owner.asAttribute()).attributeInferred(attribute);
340+
return AttributeImpl.from(owner.asAttribute()).attributeInferred(attribute);
339341
}
342+
return null;
343+
} else {
344+
Role ownerRole = tx().getRole(Schema.ImplicitType.HAS_OWNER.getLabel(attribute.type().label()).getValue());
345+
Role valueRole = tx().getRole(Schema.ImplicitType.HAS_VALUE.getLabel(attribute.type().label()).getValue());
346+
return owner.asThing().relations(ownerRole)
347+
.filter(relation -> relation.rolePlayersMap().get(valueRole).contains(attribute))
348+
.findFirst().orElse(null);
340349
}
341350
}
342351

@@ -375,10 +384,16 @@ public Stream<ConceptMap> materialise(){
375384
}
376385

377386
if (attribute != null) {
378-
attachAttribute(owner, attribute);
379-
return Stream.of(ConceptUtils.mergeAnswers(substitution, new ConceptMap(ImmutableMap.of(resourceVariable, attribute))));
387+
Relation relation = attachAttribute(owner, attribute);
388+
if (relation != null) {
389+
ConceptMap answer = new ConceptMap(ImmutableMap.of(resourceVariable, attribute));
390+
if (getRelationVariable().isReturned()){
391+
answer = ConceptUtils.mergeAnswers(answer, new ConceptMap(ImmutableMap.of(getRelationVariable(), relation)));
392+
}
393+
return Stream.of(ConceptUtils.mergeAnswers(substitution, answer));
394+
}
380395
}
381-
return Stream.of(new ConceptMap());
396+
return Stream.empty();
382397
}
383398

384399
/**

server/src/server/kb/concept/RelationImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,6 @@ public VertexElement vertex() {
229229
}
230230

231231
public Relation attributeInferred(Attribute attribute) {
232-
reify().attributeInferred(attribute);
233-
return this;
232+
return reify().attributeInferred(attribute);
234233
}
235234
}

server/src/server/kb/concept/ThingImpl.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -291,9 +291,8 @@ public T has(Attribute attribute) {
291291
return getThis();
292292
}
293293

294-
public T attributeInferred(Attribute attribute) {
295-
attributeRelation(attribute, true);
296-
return getThis();
294+
public Relation attributeInferred(Attribute attribute) {
295+
return attributeRelation(attribute, true);
297296
}
298297

299298
@Override

test-integration/graql/reasoner/reasoning/AttributeAttachmentIT.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,13 @@
2727
import graql.lang.query.GraqlGet;
2828
import graql.lang.statement.Statement;
2929
import graql.lang.statement.Variable;
30+
import java.util.List;
31+
import java.util.Set;
3032
import org.junit.AfterClass;
3133
import org.junit.BeforeClass;
3234
import org.junit.ClassRule;
33-
import org.junit.Ignore;
3435
import org.junit.Test;
3536

36-
import java.util.List;
37-
import java.util.Set;
38-
3937
import static grakn.core.server.kb.Schema.ImplicitType.HAS;
4038
import static grakn.core.server.kb.Schema.ImplicitType.HAS_OWNER;
4139
import static grakn.core.server.kb.Schema.ImplicitType.HAS_VALUE;
@@ -146,12 +144,9 @@ public void whenReasoningWithAttributesInRelationForm_ResultsAreComplete() {
146144
}
147145
}
148146

149-
//TODO leads to cache inconsistency
150-
@Ignore
151147
@Test
152148
public void whenReasoningWithAttributesWithRelationVar_ResultsAreComplete() {
153149
try(TransactionOLTP tx = attributeAttachmentSession.transaction().write()) {
154-
155150
Statement has = var("x").has("reattachable-resource-string", var("y"), var("r"));
156151
List<ConceptMap> answers = tx.execute(Graql.match(has).get());
157152
assertEquals(3, answers.size());

0 commit comments

Comments
 (0)